变量类型
存储地址,空间 | ||
---|---|---|
基本数据类型 | 存储在栈中,占空间大小固定 | undefined,null,boolean,number,string,symbol |
引用数据类型 | 存储在堆中,大小不固定,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体 | 对象 |
由于引用数据类型的特殊性,在函数传值时需要特别注意,来看以下例子:
let obj = {
name: 'liaof'
}
function foo(o) {
o.name = 'liaox';
}
foo(obj);
console.log(obj);
let obj1 = {
name: 'liaof'
}
function foo1(o) {
o = {
name : 'liaoxin'
}
}
foo1(obj1);
console.log(obj1)
解答:js函数参数的传递形式–按值传递,传递的是地址
第一段代码:obj的地址传给o,o与obj指向同一个对象,因此会改变
第二段代码:后面把o指向了另一个对象,因此obj的指向没变
再来一个题目:
var arr = []
var obj = {a:1}
arr.push(obj)
console.log(arr)
obj.a = 2
console.log(arr)
var obj1 = obj
obj = {a:3}
console.log(arr)
obj1.a = 4
console.log(arr)
你做对了吗?一定要把图画出来。1224
变量类型检测
typeof
// 7种可能值
typeof undefined === 'undefined'
typeof 1 === 'number'
typeof 's' === 'string'
typeof function a() {} === 'function'
typeof [] === 'object'
typeof Symbol('s') === 'symbol'
typeof true === 'boolean'
// 需要注意的
typeof null === 'object'
typeof NaN === 'number'
instanceof
用于检测构造函数的原型是否出现在对象的原型链上
function Person(name, age) {
this.name = name
this.age = age
}
let p = new Person('liaofang', 18)
console.log(p instanceof Person)
console.log(p instanceof Object)
手写instanceof
function myInstanceof(left, right) {
while(left) {
if(left.__proto__ === right.prototype) {
return true
}
left = left.__proto__
}
return false
}
计算及逻辑
不同数据类型间进行加法的类型转换
数据先转换为number,然后转换为string(如果有string类型数据参与运算)
数据前有加号‘+’,可以让字符串转化为数字
原始数据类型 | number |
---|---|
boolean | true: 1, false: 0 |
undefined | NaN (要注意不是0) |
null | 0 |
string | 相应的数字或者NaN |
object | NaN |
不同数据类型转为布尔
数据类型 | 布尔值 | tip |
---|---|---|
string | 空字符串为false,其余为true | 字符串0/false 均 转为true |
number | 0/+0/-0/NaN为false,其余为true | |
object | true | 空对象/空数组 均转为true |
undefined | false | |
null | false |
== 和 === 的一些特殊情况
==
- null == undefined true
- NaN == NaN false
===
- null === null true
&& 和 ||
逻辑与和逻辑或作混合运算,与的优先级高
&&和||的短路运算,是指如果在进行前面的表达式的运算过程,通过判断已经明确的知道整个表达式的结果,那么就不会进行后面表达式的运算判断。
(然后返回值,不是转为boolean的值)
实际编程中常用的:
- if条件判断中 与和或 的使用
- 用于赋值 ||按顺序哪个为真就赋值哪个 经常用来判断一个变量是否已定义,如果没有定义就给他一个初始值 var Yahoo = Yahoo || {}
- 用于执行语句 a >= 5 && alert(“你好”)