您的位置:首页 > Web前端 > JavaScript

从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”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息