变量类型
JS变量最基本的分类就是值类型和引用类型,而两者的区别,我这里举个例子看一下。
以下是值类型的一个例子:
var a = 50
var b = a
console.log(b)
以下是引用类型的一个例子:
var a = {name:"zhangsan"}
var b = a
b.name = "lisi"
console.log()
typeof
可以识别值类型,而对于引用类型则无能为力。但是,typeof
可以将引用类型区分出function
—— 相对于其他引用类型(如对象、数据)来说,具有非常特殊的意义。JS中的函数非常重要,因为原型、作用域都需要用到函数。
JS有很多内置函数,例如Object
、Array
、Boolean
、Number
、String
、Date
、RegExp
、Error
等,基本都是基础数据类型的构造函数。
typeof
可以区分的类型:number、string、undefined(值类型)、object、function(引用类型)
typeof null // output: object 因为null也是引用类型,相当于引用类型中的undefined
另外针对第二个例子,怎么将a
的内容复制给b
,从而保证a
不影响到b
?这里可以运用深度复制,将a
的属性递归遍历,依次复制。
以下是实现代码,不对的欢迎指正:
deepClone(o, newO) {
for (var key in o) {
if (o.hasOwnProperty(key)) {
if (typeof o[key] == "object" || typeof o[key] === "function") {
deepClone(o[key], newO[key])
} else {
o[key] = newO[key]
}
}
}
}
变量计算
简单的+
、-
、*
、/
以及字符串的拼接和替换,这里不提。但是在JS值类型的运算过程中,存在强制类型转换这一特性,有以下的场景:
- 字符串拼接
==
- 逻辑运算(
if
!
||
&&
)
首先是字符串拼接的常见错误,这里怎么规避呢 —— 可以使用typeof
来解决,但是比较麻烦,因为写代码就是一件很累的事情。
var a = 100 + 10 // 110
var b = 100 + "10" // "10010"
==
也会进行强制转换,如
100 == "100" // true (100 "100")
0 == "" // true ("" 0 false)
null == undefined // true (object undefined)
最后是逻辑运算中的强制转换,先说下if
var a = true
if (a) { // true
// ...
}
var b = 100
if (b) { // true
// ...
}
var c = ""
if (c) { // false
// ...
}
也就是所有经过if
判断的变量,都会进行逻辑运算的强制类型转换,转换为true
或者false
。
console.log(10 && 0) // false
console.log (10 || 0) // true
console.log(!0) // false
日常开发中,以下变量会被强制转换成false
:
- 0
- NaN
- undefined
- null
- ""
- false本身
这里引出一个另外一个问题,比如if(a)
如何知道变量被if
转换为什么? —— !!a
网友评论