做者:ManfredHu
连接:http://www.manfredhu.com/2016/07/07/20-interestingJavascript
声明:版权全部,转载请保留本段信息,不然请不要转载javascript
写出下面代码的运行结果css
var a,b;
(function(){
console.log(a);
console.log(b);
var a=b=3;
console.log(a);
console.log(b);
})();
console.log(a);
console.log(b);
A. undefined,undefined,3,3,undefined,3
B. undefined,undefined,3,3,undefined,undefined
C. 0,0,3,3,undefined,undefined
D. undefined,undefined,3,3,0,0html
正确答案:A
解释:代码至关于下面这样的过程java
var a,b;
(function(){
var a;
console.log(a); //undefined
console.log(b); //undefined
a=3;
b=3;
console.log(a); //3
console.log(b); //3
})();
console.log(a); //undefined
console.log(b); //3
下面符合一个有效的javascript变量定义规则的是?正则表达式
A. _ t2
B. with
C. a bc
D. 2a数组
正确答案: A
考点:ECMAScript语法
解析:with为关键字,空格不行,数字开头的不行浏览器
JavaScript中document.getElementById
的返回值的类型和document.getElementsByTagName
的返回值类型分别是?闭包
A. Array,NodeList
B. Object, HTMLCollection
C. String,NodeList
D. Function,NodeListapp
正确答案: B
解析:这题可能有争议,浏览器测试代码以下函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Id与TagName类型检测</title>
</head>
<body>
<div id="test"></div>
<script type="text/javascript"> function checkType(element){ console.log(Object.prototype.toString.call(element)); } checkType(document.getElementById('test')); //[object HTMLDivElement] checkType(document.getElementsByTagName('div')); //[object HTMLCollection] </script>
</body>
</html>
下面关于块内函数的作法哪些是正确的?
A. if(x){ function foo(){}}
B. if(x){ var function foo(){}}
C. if(x){ foo = function(){}}
D. ECMAScript明确的规范了块级函数,JavaScript实现了这个规范
正确答案:B
解析:测试报错
下列代码
var obj={}
……
obj.hasOwnProperty("val");
中hasOwnProperty的做用是?
A. 判断obj对象是否具备val的属性
B. 判断obj对象是否具备val的值
C. 判断obj的原型对象是否具备val的属性
D. 判断obj的原型对象是否具备val的值
正确答案:A
解析:hasOwnProperty()
函数用于指示一个对象自身(不包括原型链)是否具备指定名称的属性。若是有,返回true
,不然返回false
下面有关JavaScript中 call和apply的描述,错误的是?
A. call和apply都属于Function.prototype的方法,因此每一个function实例都有call,apply属性
B. 二者传递的参数不同,call函数第一个参数都是传入给当前对象的对象,apply不是
C. apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入
D. call传入的则是直接的参数列表。call方法可将一个函数的对象上下问从出事的上下文改变为thisObj指定的新对象。
正确答案:B
解析:apply
和call
都是改变函数内部this
指向的方法,挂载在Function.prototype
下
(不定项选择题)给网页添加javascript的方式有
A. 使用script标签,将JavaScript代码写到<script></script>之间
B. 添加外部javascript文件
C. 使用行内javascript
D. 使用@import引入javascript文件
正确答案:A,B,C
解析:只有CSS能够用@import
方法,题目其实能够换成CSS,则所有正确
给网页添加css的方式有
A. 使用style标签,将JavaScript代码写到<style></style>之间
B. 添加外部css文件
C. 使用行内css
D. 使用@import引入css文件
[“1”, “2”, “3”].map(parseInt)的输出结果是
A. [1,NaN,NaN]
B. [1,2,3]
C. [NaN,NaN,NaN]
D. 发生错误
正确答案: A. [1,NaN,NaN]
解析:
Array.prototype.map(func(currentValue, index, arrary),thisObj)
currentValue, index, arrary
以下的例子来看this
的运用和基数的例子:
var obj = {
value:1
};
["1", "2", "3"].map(function(currentValue, index, arrary){
console.log(this); //输出3次obj
},obj);
console.log(parseInt('1', 0)); //1
console.log(parseInt('123', 0)); //123
console.log(parseInt('2', 1)); //NaN
console.log(parseInt('3', 2)); //NaN
当["1", "2", "3"].map(parseInt)
的时候,传入parseInt
的参数为currentValue
,index
function foo() { }
var oldName = foo.name;
foo.name = "bar";
console.log([oldName, foo.name]);
A. [‘foo’,’bar’]
B. [‘foo’,’foo’]
C. [‘bar’,’bar’]
D. [‘bar’,’foo’]
答案:B.[‘foo’,’foo’];
函数的name
属性指向函数名,挂载在Function.prototype
下,因此不要给函数赋值属性name
哈。而且这个属性是不可改变的.
因此下面这样的例子就不要出现了
function foo() {}
foo.name = "bar"; //bad,你竟然真忘了Function.prototype.name是一个不可修改的属性!!
测试代码:
console.log(Function.prototype.hasOwnProperty('name')); //true
var lowerCaseOnly = /^[a-z]+$/;
[lowerCaseOnly.test(null), lowerCaseOnly.test()]
A. false, true
B. false,true
C. true,true
D. true,false
答案: C.true, true
如题所示,test
方法若是参数为null
或者不屑,则默认返回true
写出这段代码的运行结果
<SCRIPT type="text/javascript"> var bb = 1; function aa(bb) { bb = 2; console.log(bb); }; aa(bb); console.log(bb); </SCRIPT>
正确答案: 2 1
以下代码输出的结果是什么:
console.log(1+ "2"+"2");
console.log(1+ +"2"+"2");
console.log("A"- "B"+"2");
console.log("A"- "B"+2);
正确答案:
122 //数字与字符串+则数字默认转换为字符串
32 //+号会将字符串2先转化为数字,这种也是经常使用的将字符串转换为数字的方式
NaN 2
NaN
解析:插播——常见的将字符串转换为数字的方法:
parseInt
,具体使用请看前面第8题+"123"
相似这种写法,好比某个参数不肯定是否是数字能够这样 +data.len
Number
方法从带宽(精简压缩后)考虑会用第二种,因此一般会在代码上大量看到这种写法
[typeof null, null instanceof Object]
的输出结果是
正确答案:object, false
解析:
null
为一个空的对象,这个对象存在可是里面一点东西都没有,至关于有堆空间可是里面没有属性。而undefined
能够理解为连堆空间都没有(至少表现出来是这样的不是吗?)
null instanceof Object
为false
是由于null
连属性都没有,更没有检测原型链的_proto_
和prototype
了。
+
运算符优先于?:
运算符var val = ‘smtg’;
console.log(‘Value is ’ + (val === ‘smtg’) ? ‘Something’ : ‘Nothing’);
正确答案: ‘Something’
写出下面代码的执行效果
var name = 'World!';
(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
正确答案: Goodbye Jack
编译语法分析后代码(声明提高)以下
var name = 'World!';
(function () {
var name;
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye ' + name); //Goodbye Jack
} else {
console.log('Hello ' + name);
}
})();
写出下面题的答案
var END = Math.pow(2, 53);
var START = END - 100;
var count = 0;
for (var i = START; i <= END; i++) {
count++;
}
console.log(count);
正确答案:不会输出,由于END是最大值了,
解析:在 JS 里, Math.pow(2, 53) == 9007199254740992
是能够表示的最大值. 最大值加一仍是最大值. 因此循环不会停
输出0.1+0.2 === 0.3的结果,并简单地解释。
解析:经典的题目,浮点数由于存在偏差,因此不能用===
断定,一般在金额处理的时候会乘以10/100倍来小数部分的数据
写出答案
"1 2 3".replace(/\d/g, parseInt)
答案:1, NaN, 3
解析:replace()
方法的参数第二个参数能够是函数而不是字符串。在这种状况下,每一个匹配都调用该函数,它返回的字符串将做为替换文本使用。
1.该函数的第一个参数是匹配模式的字符串
2.接下来的参数是与模式中的子表达式匹配的字符串,能够有 0 个或多个这样的参数
3.接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置
4.最后一个参数是 stringObject 自己。
题目中由于没有子表达式匹配,即()
括起来的匹配项,因此传入parseInt
的参数三次分别为:
parseInt("1", 0) //1,由于当基数为0时候直接输出第一个参数
parseInt("2",2) //NaN,由于2进制只有01两个数字
parseInt("3",4) //3,由于不超过四进制的最大值4
function f() {}
var a = f.prototype, b = Object.getPrototypeOf(f);
console.log(a === b);
答案:false
解析以下:
function f() {}
var a = f.prototype; //Object
var c = new f();
var b = Object.getPrototypeOf(f); //function
var d = Object.getPrototypeOf(c); //Obejct
console.log(a === b); //false
console.log(d === a); //true
函数的原型是一个对象,而函数的原型会是函数,对象的原型会是对象
题目这里就是让你混淆普通函数的原型究竟是什么?函数仍是对象?
答案是函数,由于普通函数的_proto_
指向的是Function.prototype
,因此Object.getPrototypeOf
拿到的是function
你能够狠狠戳这里去看我之前写的15条规则解析JavaScript对象布局
这里应该能够看的很清楚了,函数Foo
的prototype
是Foo.prototype
而Object.getPrototypeOf
拿的是_proto_
指向的Function.prototype
,因此输出的是一个function
。
而普通对象,如图的o1
,o2
,_proto_
指向的是Object.prototype
[,,,].join(", ")
答案: “, , ”
解析:
[,,,].lenth //3
[,,,].join('-') //--
因此这题很明显了,三个逗号默认忽略最后一个,而后用’-‘会在两项中间添加链接符
var a = Function.length,
b = new Function(1,'2234').length;
console.log(a === b);
答案 false
解析:a为1,b为0,不相等
var min = Math.min(), max = Math.max()
min < max
答案;false
解析:min为Infinity,b为-Infinity,结果是min > max
min() 方法可返回指定的数字中带有最低值的数字。
Math.min(x,y) 若是没有参数,则返回 Infinity。若是有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。max() 方法可返回两个指定的数中带有较大的值的那个数。
Math.max(x…) 若是没有参数,则返回 -Infinity。若是有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。
function aa() {
console.log("aaa");
return function(){
console.log("bbb");
};
}
console.log(aa);
console.log(aa());
console.log(aa()());
答案:
function aa() {
console.log("aaa");
return function(){console.log("bbb");};
}
aaa
function(){console.log("bbb");};
aaa
bbb
undefined
第一个输出aa的函数体,你们都懂
第二个执行了aa()
,输出文本"aaa"
,同时返回了里面的匿名函数
第三个在第二步的基础上执行了匿名函数,最后再输出一个bbb,最后由于执行函数没有返回值,返回了undefined
类数组对象是什么?说一下你知道的JavaScript里面类数组对象有哪些,类数组怎么转化为数组?
类数组: 指向对象元素的数字索引下标以及
length
属性告诉咱们对象的元素个数,可是不具备诸如push
、forEach
以及indexOf
等数组对象具备的方法
常见例子: DOM方法 document.getElementsByClassName() 的返回结果(实际上许多DOM方法的返回值都是类数组)以及特殊变量 arguments
因此一般要有一个转换的过程,借助 Array.prototype.slice
能够实现:
Array.prototype.slice.call(arguments) //arguments转化为普通数组
写出下面代码输出的结果并写出你的解题思路?
function Foo() {
getName = function () { console.log (1); };
return this;
}
Foo.getName = function () { console.log (2);};
Foo.prototype.getName = function () { console.log (3);};
var getName = function () { console.log (4);};
function getName() { console.log (5);}
//请写出如下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
答案:
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3
下面代码的运行结果是?
<html>
<head>
<meta charset="utf-8">
<title>DOM进阶</title>
<script type="text/javascript"> window.onload=function(){ var buttons=document.getElementsByName('button1'); for(var i=0;i<buttons.length;i++){ buttons[i].onclick=function(){ console.log(i); }; } }; </script>
</head>
<body >
<input type="button" name="button1" value="按钮1" />
<input type="button" name="button1" value="按钮2" />
<input type="button" name="button1" value="按钮3" />
<input type="button" name="button1" value="按钮4" />
<input type="button" name="button1" value="按钮5" />
</body>
</html>
这个错新手估计会犯,当初的我也是。
闭包,点那个按钮都是输出 buttons.length
的值,这里是5