JavaScript红宝书01|初学者容易不明白的地方


前言

今天重新拾起来《JavaScript高级程序设计(第3版》了,之前因为它太厚了,一直没有坚持看下去。静下心去读读,还是会发现很多惊喜的地方,书写的还是非常不错的,下面记录一些之前刚接触js时不明白的地方。


一、JavaScript和ECMAScript的关系?

虽然 JavaScript 和 ECMAScript 通常都被人们用来表达相同的含义,但 JavaScript 的含义却比 ECMA-262 中规定的要多得多。

在这里插入图片描述
一个完整的 JavaScript 实现应该由下列三个不同的部分组成
核心(ECMAScript):是一种可以在宿主(web浏览器/node环境)环境中运行的程序设计语言
文档对象模型(DOM): 把整个页面映射为一个多层节点结构,可以删除、添加、替换或修改任何节点。
浏览器对象模型(BOM):处理浏览器窗口和框架

二、为什么函数不是基本类型?

从技术角度讲,函数在 ECMAScript 中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过 typeof 操作符来区分函数和其他对象是有必要的。

typeof 可以区分函数和对象

        console.log(typeof function(){});//function
        console.log(typeof [1,2]);//object
        console.log(typeof {});//object
        console.log(typeof null);//objeect

为什么typeof null为obejct?
从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object"的原因 。null的【类型标签】也是000,和Object的类型标签一样,所以会被判定为Object。

✅只声明未定义的变量会显示undefined,未声明直接报错

        let a;
        console.log(a);//undefined
        console.log(b);//报错

✅无论时只声明未定义的变量还是未声明的变量,typeof判断都为undefined

        let a;
        console.log(typeof a);//undefined
        console.log(typeof b);//undefined

三、为什么0.1+0.2 != 0.3

JS 中的Number类型只能安全地表示-(2^53-1)2^53-1之间的整数,任何超出此范围的整数值都可能失去精度,会被四舍五入。浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加 0.2的结果不是 0.3,而是 0.30000000000000004。

✅由于内存的限制,ECMAScript 并不能保存世界上所有的数值。
最大值的表示:Number.MAX_VALUE , 超出最大值会被转成Infinity
最小值的表示:Number.MIN_VALUE , 小于
isFinite()函数:判断一个数是否在最大值和最小值之间,如果在就返回true。

怎么表示任意大的数字?
使用BigInt
使用方法:
1.整数的末尾加n
2. 调用BigInt()构造函数

四、NAN和isNaN()

NaN,即非数值(Not a Number)是一个特殊的数值。例如,在其他编程语言中,任何数值除以 0都会导致错误,从而停止代码执行。但在 ECMAScript中,任何数值除以 0会返回 NaN,因此不会影响其他代码的执行。
特点:
1.任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN
2.NaN 与任何值都不相等,包括 NaN 本身。
isNaN()函数:用来判断传入的值是否是非数值,如果不是数值会进行转换,不能转换的值会返回true。

  alert(isNaN(NaN)); //true 
  alert(isNaN(10)); //false(10 是一个数值)
  alert(isNaN("10")); //false(可以被转换成数值 10)
  alert(isNaN("blue")); //true(不能转换成数值)
  alert(isNaN(true)); //false(可以被转换成数值 1)

五、Number()、parseInt()和 parseFloat()数值转换区别

Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。
而另两个函数则专门用于把字符串转换成数值。
Number()
– 如果是 Boolean 值,true 和 false 将分别被转换为 1 和 0。
– 如果是 null 值,返回 0
– 如果是 undefined,返回 NaN
– 如果是字符串,遵循下列规则:
 忽略前面的0,比如"011"会变成 11,浮点数也会。
 字符串中包含有效的十六进制格式,例如"0xf",则将其转换为十进制整
数值,其他进制也会。
空字符串转为0
 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
– 如果是对象,调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换
的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符
串值。

     var num1 = Number("Hello world!"); //NaN 
     var num2 = Number(""); //0 
     var num3 = Number("000011"); //11 
     var num4 = Number(true); //1 

parseInt()
(与Number()不同点)
空字符串会得到NaN
小数点不保留
– 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如,"1234blue"会被转换为 1234,
第二个参数可以传入要转换的进制。"070"这个数是看成十进制还是八进制,存在歧义。如果有第二个参数,字符串可以不带前面的进制前缀。没有传第二个参数,一定要带前缀。

    var num1 = parseInt("1234blue"); // 1234 
    var num2 = parseInt(""); // NaN
    var num3 = parseInt(22.5); // 22 
    var num4 = parseInt("0xA"); // 10(十六进制数)
    var num5 = parseInt("0xAF", 16); //175
    var num6 = parseInt("AF", 16); //175 
    var num7 = parseInt("AF"); //NaN 

parseFloat()
(与parseInt()不同点)
–由于 parseFloat()只解析十进制值,因此它没有第二个参数指定基
数的用法。

     var num1 = parseFloat("1234blue"); //1234 (整数)
     var num2 = parseFloat("0xA"); //0 注意这里!!
     var num3 = parseFloat("22.5"); //22.5 
     var num4 = parseFloat("22.34.5"); //22.34 
     var num5 = parseFloat("0908.5"); //908.5 
     var num6 = parseFloat("3.125e7"); //31250000 

六、字符串的转换、toString()还能进制转换

数值、布尔值、对象和字符串值都会有toString()方法,但null 和 undefined 值没有这个方法。
toString()参数还可以传入基数,输出转换进制的字符串值。

     var num = 10; 
     alert(num.toString()); // "10" 
     alert(num.toString(2)); // "1010" 
     alert(num.toString(8)); // "12" 
     alert(num.toString(10)); // "10" 
     alert(num.toString(16)); // "a" 

在不知道要转换的值是不是 null 或 undefined 的情况下,还可以使用转型函数 String(),这个
函数能够将任何类型的值转换为字符串。

七、Object 的每个实例都具有的属性和方法

constructor:显示用于创建当前对象的函数。
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。属性名必须用字符串的形式。
isPrototypeOf(object):检查传入的对象是否存在另一个对象的原型链上。
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句来枚举。
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值相同。


总结

这篇总结了七个之前不太明白的小知识点,书目前看到了第三小节操作符,之后也会持续整理总结出笔记📝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值