Javascript面试题初级

来源:BAT及各大互联网公司2014前端笔试面试题--JavaScript篇

1、JavaScript是一门什么样的语言,它有哪些特点?

JavaScript是一种动态语言
所谓的动态类型语言,意思就是类型的检查是在运行时做的。
静态类型语言的类型判断是在运行前判断(如编译阶段),比如C#、java就是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,所以一般动态语言都会采用dynamic typing,常出现于脚本语言中.
脚本语言是一种解释性的语言,例如Python、vbscript,javascript,installshield script,ActionScript等等,它不象c\c++等可以编译成二进制代码,以可执行文件的形式存在,脚本语言不需要编译,可以直接用,由解释器来负责解释。
弱类型事件驱动(参考:JavaScript特点、优缺点及常用框架

2、JavaScript的数据类型都有什么?

基本数据类型:String,Boolean,Number,Undefined, Null。

null表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
Object.getPrototypeOf(Object.prototype)// null
获取元素时,如果当前文档中特定元素不存在则返回null.
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。

引用数据类型:Object(Array,Date,RegExp,Function)
那么问题来了,如何判断某变量是否为数组数据类型?(参考:http://www.cnblogs.com/SanMaoSpace/archive/2013/06/14/3136774.html)
通过调用Object上的方法

function isArrayFn(value){  
    if (typeof Array.isArray === "function") {  
        return Array.isArray(value);      
    }else{  
        return Object.prototype.toString.call(value) === "[object Array]";      
    }  
} 

3、已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架)

document.getElementById(“ID”).value

4、希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)

var domList = document.getElementsByTagName(‘input’)
var checkBoxList = [];
var len = domList.length;  //缓存到局部变量
while (len--) {  //使用while的效率会比for循环更高
  if (domList[len].type == ‘checkbox’) {
      checkBoxList.push(domList[len]);
  }
}```
###5、设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架)

var dom = document.getElementById(“ID”);
dom.innerHTML = “xxxx”;
dom.style.color = “#000”;

###6、当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?
 直接在DOM里绑定事件:`<div onclick=”test()”></div>`
 在JS里通过onclick绑定:`xxx.onclick = test `
 通过事件添加进行绑定:`addEventListener(xxx, ‘click’, test) `

**那么问题来了,Javascript的事件流模型都有什么?**
“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播
“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡
>IE9、Safari、Chrome、Firefox和Opera9.5及更高版本都会在捕获阶段触发事件对象上的事件,就是**有两个机会在目标对象上面操作事件**。(尽管DOM2级事件规范明确要求捕获阶段不涉及事件目标)。(高程p348)

html
<div id="outer">outer
<div id="inner">inner</div>
</div>
js
var outerDiv = document.querySelector("#outer");
var innerDiv = document.querySelector("#inner");
innerDiv.addEventListener("click", function(e) {
console.log("inner");
})
outerDiv.addEventListener("click", function(e) {
console.log("outer");
}, true)
//默认为false,指定outer上的事件 在冒泡阶段触发,点击inner,输出inner,outer
//为true,指定outer上的事件在捕获阶段触发,点击inner,输出outer,inner
//只点击outer非inner的部分,当然只触发outer的事件
//inner上的事件就是在目标阶段触发

###7、什么是Ajax和JSON,它们的优缺点。
Ajax是异步JavaScript和XML,用于在Web页面中实现异步数据交互。
**优点:**
可以使得页面不重载全部内容的情况下加载局部内容,降低数据传输量
避免用户不断刷新或者跳转页面,提高用户体验

**缺点:**
对搜索引擎不友好(
要实现ajax下的前后退功能成本较大
可能造成请求数的增加
跨域问题限制

JSON是一种轻量级的数据交换格式,ECMA的一个子集
优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)
###8、看下列代码输出为何?解释原因。

var a;
alert(typeof a); // undefined
alert(b); // 报错
typeof(null)//"object"

解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。
null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。
###9、看下列代码,输出什么?解释原因。

var undefined;
undefined == null; // true
1 == true; // true
2 == true; // false
0 == false; // true
0 == ''; // true
NaN == NaN; // false
[] == false; // true
[] == ![]; // true

undefined与null相等,但不恒等(===)

一个是number一个是string时,会尝试将string转换为number

尝试将boolean转换为number,0或1

尝试将Object转换成number或string,取决于另外一个对比量的类型

所以,对于0、空字符串的判断,建议使用 “===” 。“===”会先判断两边的值类型,类型不匹配时为false。

那么问题来了,看下面的代码,输出什么,foo的类型为什么?

var foo = "11"+2-"1";
console.log(foo);
console.log(typeof foo);

执行完后foo的值为111,foo的类型为Number。

var foo = "11"+2+"1"; //体会加一个字符串'1' 和 减去一个字符串'1'的不同
console.log(foo);
console.log(typeof foo);

执行完后foo的值为1121(此处是字符串拼接),foo的类型为String。
###10、看代码给答案。

var a = new Object();
a.value = 1;
b = a;
b.value = 2;
alert(a.value);

答案:2(考察引用数据类型细节)
###11、已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。

答案:alert(stringArray.join(" "))

那么问题来了,已知有字符串foo="get-element-by-id",写一个function将其转化成驼峰表示法"getElementById"。

function combo(msg){
var arr = msg.split("-");
var len = arr.length; //将arr.length存储在一个局部变量可以提高for循环效率
for(var i=1;i<len;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}

(考察基础API)
###12、var numberArray = [3,6,2,4,1,5]; (考察基础API)

  1) 实现对该数组的倒排,输出[5,1,4,2,6,3]

  2) 实现对该数组的降序排列,输出[6,5,4,3,2,1]

var numberArray = [3,6,2,4,1,5];
numberArray.reverse(); // 5,1,4,2,6,3
numberArray.sort(function(a,b){ //6,5,4,3,2,1
return b-a;
})

>*arr*.sort([*compareFunction*])
如果指明了 compareFunction
 ,那么数组会按照调用该函数的返回值排序。记 a 和 b 是两个将要被比较的元素:
如果 compareFunction(a, b)
 小于 0 ,那么 a 会被排列到 b 之前;
如果 compareFunction(a, b)
 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
如果 compareFunction(a, b)
 大于 0 , b 会被排列到 a 之前。
compareFunction(a, b)
 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

###13、输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26

var d = new Date();
// 获取年,getFullYear()返回4位的数字,注意是FullYear
var year = d.getFullYear();
// 获取月,月份比较特殊,0是1月,11是12月
var month = d.getMonth() + 1;
// 变成两位
month = month < 10 ? '0' + month : month;
// 获取日
var day = d.getDate();
day = day < 10 ? '0' + day : day;

###14、将字符串`<tr><td>{$id}</td><td>{$id}</td><td>{$id}_{$name}</td></tr>`,{id}替换成10,{name}替换成Tony (使用正则表达式)
注意转义字符
`"<tr><td>{$id}</td><td>{$id}</td><td>{$id}_{$name}</td></tr>".replace(/{\$id}/g, '10').replace(/{\$name}/g, 'Tony')`

###15、为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义

function escapeHtml(str) {
return str.replace(/[<>”&]/g, function(match) {
switch (match) {
case “<”:
return “<”;
case “>”:
return “>”;
case “&”:
return “&”;
case “\””:
return “"”;
}
});
}

###16、 看下列代码,将会输出什么?(变量声明提升)**

var foo = 1;
function(){
console.log(foo);
var foo = 2;
console.log(foo);
}

###17、用js实现随机选取10--100之间的10个数字,存入一个数组,并排序。
* 生成[min,max]的随机数

function getRandom(min, max){
var ran = Math.random();
console.log(ran);//[0,1)
//[min, max)的小数
//return ran(max-min) + min;
//[min,max)的整数
//return Math.floor(ran
(max-min)) + min;
//[min, max]的整数,进行了向下取整
return Math.floor(ran*(max-min+1)) + min;
// return Math.round((Math.random() * (max - min) + min) * 10) / 10
}
console.log(getRandom(2,6))

* 3.47->3.5
```Math.round(num*10)/10```

###18、把两个数组合并,并删除第二个元素。
字符串没有splice方法,只有slice,数组有splice
concat()。字符串和数组都有

var a1 = [1,2,3]
var a2 = [4,5,6]
var a3 = a1.concat(a2);
a3.splice(1,1)
console.log(a3);


###19、怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步)**
* 1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
* 2)添加、移除、替换、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替换
insertBefore() //插入
* 3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id,唯一性

###20、有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:'1', b:'2', c:'', d:'xxx', e:undefined}。

function serilizeUrl(url) {
var result = {};
url = url.split("?")[1];
var map = url.split("&");
for(var i = 0, len = map.length; i < len; i++) {
result[map[i].split("=")[0]] = map[i].split("=")[1];
}
return result;
}

###21、正则表达式构造函数var reg=new RegExp("xxx")与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式?
当使用RegExp()构造函数的时候,不仅需要转义引号(即\"表示"),并且还需要双反斜杠(即\\表示一个\)。**使用正则表达字面量的效率更高。 **
**邮箱**的正则匹配:

var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;

###22、看下面代码,给出输出结果。

for(var i=1;i<=3;i++){
setTimeout(function(){
console.log(i);
},0);
};

改进:

for(var i=1;i<=3;i++){
setTimeout(function(a){
console.log(a);
}(i),0);
};

###23、写一个function,清除字符串前后的空格。(兼容所有浏览器)

str.replace(/^\s+/,"").replace(/\s+$/,"")

str.replace(/^\s+|\s+$/g,"")

###24、Javascript中callee和caller的作用?
**caller: 返回一个对函数的引用,该函数调用了当前函数。**
>对于函数来说,**caller 属性只有在函数执行时才有定义**。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。(fn.caller), 各下面一样为了避免强耦合,通常会这样调用:arguments.callee.caller;

**callee: 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。**( arguments.callee)
>callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。

callee实现阶乘: 使用callee不用fn就是为了避免强耦合
比如 var fn2 = fn; fn= function()(){};fn2(100)会找不到原来的fn

function fn(n){
if(n <= 1){
return 1
}
return n * arguments.callee(n-1)
}

斐波那契数列

var result=[];
function fn(n){ //典型的斐波那契数列
if(n==1){
return 1;
}else if(n==2){
return 1;
}else{
if(result[n]){
return result[n];
}else{
//argument.callee()表示fn()
result[n]=arguments.callee(n-1)+arguments.callee(n-2);
return result[n];
}
}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容