Open yuqingc opened 4 years ago
typeof instance === "undefined"
typeof instance === "boolean"
typeof instance === "number"
typeof instance === "string"
typeof instance === "bigint"
typeof instance === "symbol"
typeof null === object
typeof null === "object"
Object typeof instance === "object"
typeof instance === "object"
Function typeof instance === "function"
typeof instance === "function"
以上数据类型来自 MDN 文档。因为红宝书出版的时候是几年前了,所以没有记录 BigInt 类型。Function 其实也是一种 Object,但是Function 可以调用,比较特殊,所以可以单独作为一种类型。其他的例如 Array, Map, Set, WeakMap, WeakSet 都毫无疑问,属于 Object 类型。 利用 typeof 就可以判断一个值的类型(null 特殊需要注意)
以上数据类型来自 MDN 文档。因为红宝书出版的时候是几年前了,所以没有记录 BigInt 类型。Function 其实也是一种 Object,但是Function 可以调用,比较特殊,所以可以单独作为一种类型。其他的例如 Array, Map, Set, WeakMap, WeakSet 都毫无疑问,属于 Object 类型。
BigInt
Array
Map
Set
WeakMap
WeakSet
利用 typeof 就可以判断一个值的类型(null 特殊需要注意)
typeof
注意以下情况:
let name // let age console.log(name) // undefined console.log(age) // 报错 未定义 // 但是 console.log(typeof name) // 会打印 "undefined" 不会报错
undefined
null
强烈不建议直接给变量赋值 undefined,undefined 一般用来比较
建议在定义变量时候都给个初始值
可以给变量赋值 null,表示空对象(空指针)
浮点类型占用内存是整形的 2 倍,因此 JS 会尽量将浮点类型转换为整形
let a = 1.0,其中 a 会被解析为整形
let a = 1.0
a
其他使用 IEEE-754 标准的语言也有 0.1 + 0.2 不等于 0.3 的问题。这个不是 jS 的锅
0.1 + 0.2
0.3
NaN
NaN === NaN
false
isNaN()
Number.isNaN()
有 3 个强制转换为 Number 类型的函数
Number()
parseInt()
parseFloat()
语法如下
function simpleTag (strings, ...expressions) { // 其中 // stings 是一个字符串数组 // 省下的参数为字符串中,按顺序的插值 ${} } // 例子 simpleTag`${a}hello${b}world` // 那么在函数中接受的参数依次为 // ["", "hello", "world"] // a 的值 // b 的值
注意:第一个参数是个数组,并且带有一个 raw 的属性,raw 也是一个数组,里面是原始的未转义的字符。具体 API 请查阅文档。
raw
内置的 String.raw Tag 函数,会返回未转义的字符串
String.raw
console.log(`\u00A9`); // © console.log(String.raw`\u00A9`); // \u00A9
new Symbol()
Symbol()
Number
String
Boolean
new
BigInt()
我的理解:为什么 Number, String, Boolean 可以用 new 创建而 BigInt 和 Symbol 不行呢? 因为给基本类型使用 . 语法调用其方法时,会被自动转换为包装对象,因此不需要显式的使用 new 来创建包装类型。所以 ES6 之后新加入的两个类型,就被设计成不允许使用 new 来创建包装对象了。同样地,即使其他类型支持 new 来创建包装类型,但是代码规范不建议这样使用。 注意强制类型转换和包装类型的区别。比如 Number() 的返回值是 number 类型,而 new Number() 返回一个 object 类型。
我的理解:为什么 Number, String, Boolean 可以用 new 创建而 BigInt 和 Symbol 不行呢?
Symbol
因为给基本类型使用 . 语法调用其方法时,会被自动转换为包装对象,因此不需要显式的使用 new 来创建包装类型。所以 ES6 之后新加入的两个类型,就被设计成不允许使用 new 来创建包装对象了。同样地,即使其他类型支持 new 来创建包装类型,但是代码规范不建议这样使用。
.
注意强制类型转换和包装类型的区别。比如 Number() 的返回值是 number 类型,而 new Number() 返回一个 object 类型。
number
new Number()
object
Object 实例上的方法
constructor
hasOwnProperty(propertyName)
isPrototypeOf(object)(此处红宝书有错误,写成了 isPrototypeof(object))
isPrototypeOf(object)
isPrototypeof(object)
propertyIsEnumerable(propertyName)
toLocaleString()
toString()
valueOf()
略
03 Language Basics
数据类型
7 种基本数据类型
typeof instance === "undefined"
typeof instance === "boolean"
typeof instance === "number"
typeof instance === "string"
typeof instance === "bigint"
typeof instance === "symbol"
typeof null === object
Null 作为结构类型的基本数据类型(比较特殊,单独写)
typeof null === "object"
2 种结构类型(复杂类型)
Object
typeof instance === "object"
Function
typeof instance === "function"
typeof
操作符注意以下情况:
undefined
和null
强烈不建议直接给变量赋值
undefined
,undefined
一般用来比较建议在定义变量时候都给个初始值
可以给变量赋值
null
,表示空对象(空指针)Number 类型
浮点类型
浮点类型占用内存是整形的 2 倍,因此 JS 会尽量将浮点类型转换为整形
let a = 1.0
,其中a
会被解析为整形其他使用 IEEE-754 标准的语言也有
0.1 + 0.2
不等于0.3
的问题。这个不是 jS 的锅NaN
NaN === NaN
是false
isNaN()
会尝试把参数转换为 Number 类型,然后再判断是不是NaN
Number.isNaN()
直接判断值是不是NaN
强制类型转换
有 3 个强制转换为 Number 类型的函数
Number()
parseInt()
parseFloat()
String 类型
模板字符串之 Tag function
语法如下
注意:第一个参数是个数组,并且带有一个
raw
的属性,raw
也是一个数组,里面是原始的未转义的字符。具体 API 请查阅文档。内置的
String.raw
Tag 函数,会返回未转义的字符串Symbol 类型
new Symbol()
来创建一个对象,会抛异常Symbol()
函数创建一个值Number
,String
,Boolean
可以用new
来显式创建对应的包装对象类型BigInt
也不能用new
来创建对象,只能用BigInt()
函数Object 类型
Object 实例上的方法
constructor
hasOwnProperty(propertyName)
isPrototypeOf(object)
(此处红宝书有错误,写成了isPrototypeof(object)
)propertyIsEnumerable(propertyName)
toLocaleString()
toString()
valueOf()
操作符
略
Statement
略