Null 和 Undefined 可以规划为特殊的数据类型
NaN
值是啥数据类型的方式?typeof NaN
-> 字符串"number"
不一定哈!可以是布尔值、数字,但一定不能是引用类型值,默认会把引用类型值转换为字符串进行处理
let a = {
x: 100
}
let b = function fn() {
let a = 100
}
let obj = {
0: 100,
true: 'hi'
}
obj[a] = 1000
obj[b] = 2000
结果:
当然,关于引用类型的属性,你用obj[a]
、obj[b]
是可以取到值的,但是就是不能写个对象字面量,以及函数字面量
对象转化为字符串 -> 调用的是
toString
方法
一道面试题
考察:
let a = {
x: 100
}
let b = {
y: 200
}
let obj = {}
obj[a] = 'Hello'
obj[b] = 'World'
// 问 true or false
console.log(obj[a] === obj[b])
结果显然是 true
呀
为啥会这样呢?
我们:
obj[a] = 'Hello'
<=> obj['[object Object]'] = 'Hello'
obj[b] = 'World'
<=> obj['[object Object]'] = 'World'
或许你会疑问:
0 和 true 是不是也调用了toString?
老师认为这是没有转的(看了大量资料),当然,不管你按哪个理解,结果都是一样的,总之,这目前没有一个权威的解释说哪个是对的!
题外话:
怎么个特殊法?
我们知道既然数组是对象,那么它一定有键值对,但它的属性名都是数字呀!
每个数字(也叫索引)代表位置,天生自带一个length属性,代表长度
满足键值对的方式,所以它是一个对象
但是它相对普通对象的特殊性在于:
作为抽象数据类型来看的话,stack就是后进先出的,想想你叠了10个菜碟子,拿到的时候肯定是先从上边的拿,而不是从最下边的拿
在计算机里边,stack有多种应用场景。
我想了解基于Stack的内存分配是怎样的:
具体点(进程内存布局):
➹:Stack-based memory allocation - Wikipedia
➹:基本数据类型和引用类型的区别详解 - SegmentFault 思否
所谓的不可变指的是,你搞了一个原始值,你觉得你用了xxx操作改变这个值,但其实你这根本就没有改变:
// 例子1
var str = "abc";
str[0] = "d";
console.log(str) // abc
// 例子2
var str2 = "abc";
str2 = "dbc";
console.log(str) // dbc
赋值开辟了一个新的内存空间,注意,如果你把str2的值赋给str3的值,那么在Chrome里边为了节省内存,它们其实用的是同一个值,即指向的是同一引用!
➹:如何理解js中基本数据类型的值不可变_javascript_WinstonLau的博客-CSDN博客
➹:理解JavaScript:不可变的原始值与可变的对象引用
➹:数字类型