文章目录
前言
今天重新拾起来《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()方法的返回值相同。
总结
这篇总结了七个之前不太明白的小知识点,书目前看到了第三小节操作符,之后也会持续整理总结出笔记📝