七种数据类型
number :64位浮点数,
整数,小数,科学计数法,八进制写法,十六进制写法,二进制写法
正0和负0不一样,和0也不一样
无穷大,1/0,infinity,1/-0:-infinity
无法表达的数字:NaN(not a number)表示因为知识受限而无法表示的数字,它是一个数字
0/0 NaN 不等于自身
浮点数:浮动的点,小数点会乱动
符号占一位,指数占11位,有效数字占52位。
(忽略符号位)
Number.MAX_VALUE:1.7976931348623157e+308
Number.MIN_VALUE: 5e-324
精度:大于16位有效数字的数字且大于90开头存不下来,2的52次方
string :字符串
每个字符两个字节。
单引号、双引号、反引号。引号不属于字符串的一部分。
转义 'it\'s ok.' 或者交替使用。
'\u4f60' 就是'你',表示对应的Unicode字符
'\xFF'是前256个Unicode字符
用反引号包字符串,可以直接打回车。
字符串的属性:(不应该有,只有对象才能有属性)
string.length(`\n\t\r`) //3
空字符串和一个空格字符串长度不一样,分别为0、1。
string[index] //从0开始,到n-1
btoa('string') 编码 反编码atob
bool
true false
if 配bool
if value不是bool怎么办。
五个falsy值(两个空,两个数字,一个字符串)
null undefined 0、NaN ''
symbol
null
undefined
本质上没有区别。
undefined:默认的空。
如果一个变量声明了但没有赋值,默认为undefined
如果一个函数没有写return,默认返回undefined
习惯将非对象的值写为undefined,把对象的空值写为null
object(对象),唯一一种复杂类型
- 无序的数据集合
- 键值对的集合
声明方法:
let obj={'name': '111', 'age': '18'}
let obj = new Object({'name': '111'})
console.log ({'name': '111', 'age': '18'})
Object.keys(obj) //得到obj的所有key
键名是字符串,不能是标识符,可以包含任意字符
引号是可以省略的,省略之后就只能写标识符(不能以数字开头),没有数字下标,没有数字key。
属性名:属性值
加引号是最安全的键值写法。
如果key为1e2、0xFF,JS会先计算。
变量作为属性名:
let a = 'xxx'
let obj = {
[a]: 111 //不加[]的属性名会自动变成字符串,加了的会当做变量求值
}
对象的隐藏属性 (共有属性)
__proto__
隐藏属性储存着原型的地址。
共有属性组成的对象叫做原型。
对象的增删改查
删除属性
let obj = {name:'simon',age: '18'}
obj.name = undefined //删的是属性值
delete obj.name
delete obj['name'] //删的是属性名
'name' in obj //检查删除是否成功
'name' in obj &&obj.name === undefined //含有属性名,但是值为undefined
判断属性名是否在对象中只能用 in。
没有就是没有,undefined就是undefined
读属性
Object.keys(obj1) //查看自身所有属性
Object.value(obj1)
console.dir(obj1) //除了自身属性害可以看公有属性,以目录的形式打出来
obj1.hasOwnProperty('toString') //false 该属性不是自身的,而是共有的
原型
每个对象都有原型,原型里存着对象的共有属性。
对象的原型也是对象。是对象的根。
原型的原型是空(null)。
查看属性
let obj = {name: '1'; age: '18'}
obj['name'] //优先 中括号中的字符串都有引号
obj.name
obj[name] //undefined 是一个变量
obj['na'+'me'] // '1'
obj[console.log('name')] //undefined ,会打印出'name',log的返回值是undefined
修改或增加属性
直接赋值
let obj = {name: 'frank'} // name 是字符串
obj.name = 'frank' // name 是字符串
obj['name'] = 'frank'
obj[name] = 'frank' // 错,因 name 值不确定
obj['na'+'me'] = 'frank'
let key = 'name'; obj[key] = 'frank' // 通过声明一个变量来进行赋值
let key = 'name'; obj.key = 'frank' // 错,因为 obj.key 等价于 obj['key'],不是变量
批量赋值
Object.assign(obj, {age: 18, gender: 'man'}) //第一个参数是要赋值对象的名字,第二个是赋值的东西
无法通过自身修改或增加共有属性。
除非
obj.__proto__.toString = 'xxx' //可以修改,但不推荐
window.Object.prototype.toString //如果一定要修改,推荐这种方法
可以将原型删掉
obj.__proto__ = null
也可以将原型改掉,其实是在原原型对象上创建一个父元素,名字也为__proto__
let person = Object.create(common)//以common为原型创建person
改和增不会看原型链,查的时候会看。