从JS变态题中学到的一些JS生僻或重要知识点
2016-07-24 12:01
471 查看
JS变态题如下:
http://ourjs.com/detail/52fb82e13bd19c4814000001
整理了题目中一些生僻或重要知识点:
parseInt(“1”, 0) => parseInt(“1”,10) => 1
parseInt(“2”, 1) => NaN
parseInt(“3”, 2) => NaN
null instanceof Object => false 因为null没有原型链吧?那些Object原型的方法它都没有,但typeof null === “object” => true
在空数组上调用reduce方法并没有传初始值会报错TypeError
在空数组上调用reduce方法并传了初始值或只有一个元素(不论位置在哪)的数组没有传初始值则该值会被直接返回并且不会执行回调函数
”+”运算符优先级高于三元运算符中的”?”
JS中除了有Number.MAX_VALUE 还有 Number.MAX_SAFE_INTEGER,表示JS中最大的安全的整型数字,所谓安全指的是能够准确表示为整数并且能正确的比较他们或进行计算,范围为-(253-1) ~ 253-1
如Math.pow(2,53) === Math.pow(2,53) + 1 => true
计算结果可能不正确也可能正确
数组中一些迭代方法(如filter)内部迭代时会先检查这个索引值是不是数组的一个属性,或者说这个索引值下的元素有没有被初始化(没有赋值,即undefined),没有则会直接跳过,因此,arr=[1,2,3];arr[10]=11,调用filter方法时索引值3~9就直接被跳过了(稀疏数组)
IEEE754标准中的浮点数并不能精确表达小数,但有时又没问题
0.1+0.1 === 0.2 => true 0.1+0.2 === 0.3 => false
new String(“a”)出来的实例并非是字符串类型,switch中case用全等进行比较
new String(“a”) == “a” => true new String(“a”) === “a” => false
String(“a”) === “a” => true
new Number(10) == 10 => true new Number(10) === 10 => true
Infinity % 2返回NaN -9 % 2 返回-1
Array.prototype是array类型,Function.prototype是function类型
valueOf():返回最适合该对象类型的原始值;
toString():将该对象的原始值以字符串形式返回。
在数值运算里,会优先调用valueOf(),如a + b
在字符串运算里,会优先调用toString(),如alert(c)。
由上机制和字符串规则Number(“”) => 0 可推出Number([]) => 0
Array有自己的toString方法而非继承自Object原型中的
[].toString => “” [].valueOf() => []
{}.toString => [object Object] {}.valueOf() => Object{}
调用对象的toString()方法时会返回”[object type]”, type表示一个对象类型,若是自定义类型仍会返回字符串”Object”。可使用call让覆盖了Object的toString方法的对象调用Object的toString方法,如下:
toString.call(new String) => [object String]
toString.call(null) => [object Null]
toString.call(undefined) => [object Undefined]
3 < 2 < 1 =>true
分析过程:3 < 2 => false , false < 1 => 0 < 1 => true
2 == [[[2]]] => true
[[[2]]].toString() => “2”
[[2,4,[10,7]],[3],[4]] => “2,4,10,7,3,4” =>推测数组使用toString时自动忽略所有数组外括号?
3.toString() => error!
3..toString() => “3”
3…toString() => error!
JS中3. , .3 都是合法的数字,因此3. toString()中的.不会被当成函数调用
function() { var a = b = 1; } 中的a是局部变量,b是全局变量
JS引擎解析时由右向左,相当于:b = 1; var a = b;
用Object.getPrototypeOf(obj) 代替不标准的 obj.proto 来获取对象的原型对象
函数的name属性不可写,即不可通过赋值操作改变函数的name属性(浏览器中浅颜色的都是这个样子?)
字符串的replace方法第二个参数可以传入一个函数,对匹配项进行更精细的替换操作,其中函数的参数分别为匹配的字符串,捕获组(1,2…如果有),匹配的index,整个字符串
正则中的test方法会将参数自动转换成字符串,因此传入参数null或不传参数会转换成”null”, “undefined”
[, , ,].join(“,”) => “,,”
除IE8及之前版本的浏览器,其他浏览器允许最后一个元素后跟着一个逗号 “,” ,undefined会转换成空
切忌使用关键字class(以前是保留字)作为对象属性,如果要使用请加引号,另外,其他一些保留字可以接受(如int, private, throws)
Function.length === new Function().length =>false
函数的length属性指的是函数签名的参数(即形参)个数
new Function().length => 0
但是Function.length => 1…
Math.min() => Infinity
Math.max() => -Infinity
function foo(a) {
var a;
return a;
}
console.log(foo(“hello”)); //”hello”
function foo(a) {
var a = “bye”;
return a;
}
console.log(foo(“hello”)); //”bye”
http://ourjs.com/detail/52fb82e13bd19c4814000001
整理了题目中一些生僻或重要知识点:
parseInt(“1”, 0) => parseInt(“1”,10) => 1
parseInt(“2”, 1) => NaN
parseInt(“3”, 2) => NaN
null instanceof Object => false 因为null没有原型链吧?那些Object原型的方法它都没有,但typeof null === “object” => true
在空数组上调用reduce方法并没有传初始值会报错TypeError
在空数组上调用reduce方法并传了初始值或只有一个元素(不论位置在哪)的数组没有传初始值则该值会被直接返回并且不会执行回调函数
”+”运算符优先级高于三元运算符中的”?”
JS中除了有Number.MAX_VALUE 还有 Number.MAX_SAFE_INTEGER,表示JS中最大的安全的整型数字,所谓安全指的是能够准确表示为整数并且能正确的比较他们或进行计算,范围为-(253-1) ~ 253-1
如Math.pow(2,53) === Math.pow(2,53) + 1 => true
计算结果可能不正确也可能正确
数组中一些迭代方法(如filter)内部迭代时会先检查这个索引值是不是数组的一个属性,或者说这个索引值下的元素有没有被初始化(没有赋值,即undefined),没有则会直接跳过,因此,arr=[1,2,3];arr[10]=11,调用filter方法时索引值3~9就直接被跳过了(稀疏数组)
IEEE754标准中的浮点数并不能精确表达小数,但有时又没问题
0.1+0.1 === 0.2 => true 0.1+0.2 === 0.3 => false
new String(“a”)出来的实例并非是字符串类型,switch中case用全等进行比较
new String(“a”) == “a” => true new String(“a”) === “a” => false
String(“a”) === “a” => true
new Number(10) == 10 => true new Number(10) === 10 => true
Infinity % 2返回NaN -9 % 2 返回-1
Array.prototype是array类型,Function.prototype是function类型
valueOf():返回最适合该对象类型的原始值;
toString():将该对象的原始值以字符串形式返回。
在数值运算里,会优先调用valueOf(),如a + b
在字符串运算里,会优先调用toString(),如alert(c)。
由上机制和字符串规则Number(“”) => 0 可推出Number([]) => 0
Array有自己的toString方法而非继承自Object原型中的
[].toString => “” [].valueOf() => []
{}.toString => [object Object] {}.valueOf() => Object{}
调用对象的toString()方法时会返回”[object type]”, type表示一个对象类型,若是自定义类型仍会返回字符串”Object”。可使用call让覆盖了Object的toString方法的对象调用Object的toString方法,如下:
toString.call(new String) => [object String]
toString.call(null) => [object Null]
toString.call(undefined) => [object Undefined]
3 < 2 < 1 =>true
分析过程:3 < 2 => false , false < 1 => 0 < 1 => true
2 == [[[2]]] => true
[[[2]]].toString() => “2”
[[2,4,[10,7]],[3],[4]] => “2,4,10,7,3,4” =>推测数组使用toString时自动忽略所有数组外括号?
3.toString() => error!
3..toString() => “3”
3…toString() => error!
JS中3. , .3 都是合法的数字,因此3. toString()中的.不会被当成函数调用
function() { var a = b = 1; } 中的a是局部变量,b是全局变量
JS引擎解析时由右向左,相当于:b = 1; var a = b;
用Object.getPrototypeOf(obj) 代替不标准的 obj.proto 来获取对象的原型对象
函数的name属性不可写,即不可通过赋值操作改变函数的name属性(浏览器中浅颜色的都是这个样子?)
字符串的replace方法第二个参数可以传入一个函数,对匹配项进行更精细的替换操作,其中函数的参数分别为匹配的字符串,捕获组(1,2…如果有),匹配的index,整个字符串
正则中的test方法会将参数自动转换成字符串,因此传入参数null或不传参数会转换成”null”, “undefined”
[, , ,].join(“,”) => “,,”
除IE8及之前版本的浏览器,其他浏览器允许最后一个元素后跟着一个逗号 “,” ,undefined会转换成空
切忌使用关键字class(以前是保留字)作为对象属性,如果要使用请加引号,另外,其他一些保留字可以接受(如int, private, throws)
Function.length === new Function().length =>false
函数的length属性指的是函数签名的参数(即形参)个数
new Function().length => 0
但是Function.length => 1…
Math.min() => Infinity
Math.max() => -Infinity
function foo(a) {
var a;
return a;
}
console.log(foo(“hello”)); //”hello”
function foo(a) {
var a = “bye”;
return a;
}
console.log(foo(“hello”)); //”bye”
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 设计模式之创建型模式 - 特别的变量问题
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子