从JS变态题中学到的一些JS生僻或重要知识点

JS变态题如下:
http://ourjs.com/detail/52fb82e13bd19c4814000001

整理了题目中一些生僻或重要知识点:

  1. parseInt(“1”, 0) => parseInt(“1”,10) => 1
    parseInt(“2”, 1) => NaN
    parseInt(“3”, 2) => NaN

  2. null instanceof Object => false 因为null没有原型链吧?那些Object原型的方法它都没有,但typeof null === “object” => true

  3. 在空数组上调用reduce方法并没有传初始值会报错TypeError
    在空数组上调用reduce方法并传了初始值或只有一个元素(不论位置在哪)的数组没有传初始值则该值会被直接返回并且不会执行回调函数

  4. ”+”运算符优先级高于三元运算符中的”?”

  5. JS中除了有Number.MAX_VALUE 还有 Number.MAX_SAFE_INTEGER,表示JS中最大的安全的整型数字,所谓安全指的是能够准确表示为整数并且能正确的比较他们或进行计算,范围为-(253-1) ~ 253-1
    如Math.pow(2,53) === Math.pow(2,53) + 1 => true
    计算结果可能不正确也可能正确

  6. 数组中一些迭代方法(如filter)内部迭代时会先检查这个索引值是不是数组的一个属性,或者说这个索引值下的元素有没有被初始化(没有赋值,即undefined),没有则会直接跳过,因此,arr=[1,2,3];arr[10]=11,调用filter方法时索引值3~9就直接被跳过了(稀疏数组)

  7. IEEE754标准中的浮点数并不能精确表达小数,但有时又没问题
    0.1+0.1 === 0.2 => true 0.1+0.2 === 0.3 => false

  8. 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

  9. Infinity % 2返回NaN -9 % 2 返回-1

  10. Array.prototype是array类型,Function.prototype是function类型

  11. 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]

  12. 3 < 2 < 1 =>true
    分析过程:3 < 2 => false , false < 1 => 0 < 1 => true

  13. 2 == [[[2]]] => true
    [[[2]]].toString() => “2”
    [[2,4,[10,7]],[3],[4]] => “2,4,10,7,3,4” =>推测数组使用toString时自动忽略所有数组外括号?

  14. 3.toString() => error!
    3..toString() => “3”
    3…toString() => error!
    JS中3. , .3 都是合法的数字,因此3. toString()中的.不会被当成函数调用

  15. function() { var a = b = 1; } 中的a是局部变量,b是全局变量
    JS引擎解析时由右向左,相当于:b = 1; var a = b;

  16. 用Object.getPrototypeOf(obj) 代替不标准的 obj.proto 来获取对象的原型对象

  17. 函数的name属性不可写,即不可通过赋值操作改变函数的name属性(浏览器中浅颜色的都是这个样子?)

  18. 字符串的replace方法第二个参数可以传入一个函数,对匹配项进行更精细的替换操作,其中函数的参数分别为匹配的字符串,捕获组(1,2…如果有),匹配的index,整个字符串

  19. 正则中的test方法会将参数自动转换成字符串,因此传入参数null或不传参数会转换成”null”, “undefined”

  20. [, , ,].join(“,”) => “,,”
    除IE8及之前版本的浏览器,其他浏览器允许最后一个元素后跟着一个逗号 “,” ,undefined会转换成空

  21. 切忌使用关键字class(以前是保留字)作为对象属性,如果要使用请加引号,另外,其他一些保留字可以接受(如int, private, throws)

  22. Function.length === new Function().length =>false
    函数的length属性指的是函数签名的参数(即形参)个数
    new Function().length => 0
    但是Function.length => 1…

  23. Math.min() => Infinity
    Math.max() => -Infinity

  24. 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”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值