总结
本章主要是javascript最基础的部分,也是所有语言比较通用的一部分。
- 基础语法: 标识符、关键字、保留字 undefined不是保留字,意味着在代码中可以任意的修改
- 变量: var、let、const
- 数据类型: 6种原始值数据类型以及Object引用类型、以及数据的转换,其中包括了类型的转换,主要是Number类型和String类型,Symbol类型在平时的用的不多,主要是给内置对象使用的,在String对象中新增的字符串的操作方法都是使用的Symbol作为属性值。
- 操作符与基本语句: 除了常规的操作符之外,还有位运算,基本语句又包括判断语句以及循环语句。
- 函数: 简单的介绍了函数。
学到的新知识
- 模版字符串的标签函数
function tag(strings, ...args) {
let output = [strings[0]]
args.forEach((item, index) => {
output.push(item, strings[index + 1])
})
return output.join('')
}
const test = '张三'
const age = 18
console.log(tag`${test}今年${age}岁了`)
其实当数据不需要特殊处理的时候,是可以直接就使用常规的字符串,在日常的开发中,常用的做法是使用模版字符串之前就统一处理了数据,或者在${}里面简单的处理。
- String.raw 它的作用是将模板字符串不转义的原始字符串内容返回。 本质就是添加了一个\进行转义 String.raw是内置的一个模版字符串的标签函数
console.log(String.raw`这是第一段\n这是第二段`)
console.log(`这是第一段\n这是第二段`)
-
Symbol类型
Symbol是es6中新增的数据类型,使用symbol()会返回对应的值,symbol的特点就是生成的值是唯一的
const a = Symbol()
const b = Symbol()
console.log(a === b)
Symbol()方法可以传一个字符串作为这个Symbol的描述,但是描述不影响symbol的值
const a = Symbol('test')
const b = Symbol('test')
console.log(a === b)
Symbol不能使用new关键字来创建,会报错。
Symbol主要用来解决两个问题,私有属性以及命名冲突
私有属性
使用Symbol类型作为对象的属性的时候,是不能通过常规的对象获取属性的方式得到的,必要要使用该symbol的引用来获取(本质上也是因为symbol类型是唯一的
const test = Symbol('name')
const obj = {
[test]: '张三',
age: 18
}
console.log(obj[Symbol('name')], Object.keys(obj), obj[test], Object.getOwnPropertySymbols(obj))
命名冲突
多人协作时,不同的文件命名可能相同,当协作有交集时,相同的对象属性会产生冲突,使用Symbol保证了属性的唯一性,就能避免这个问题。
Symbol.for()与Symbol的keyFor()
用来创建和读取全局注册的Symbol值
Symbol.for()
创建全局注册的Symbol值,在创建之前会先查找是否存在,存在的话就直接返回,反之则进行创建。
const test1 = Symbol.for('test')
const test2 = Symbol.for('test')
console.log(test1 === test2)
Symbol.keyFor()
读取全局注册的Symbol值,没有则返回undefined
const test1 = Symbol.for('test')
const test2 = Symbol.for('test')
const test3 = Symbol('test')
console.log(Symbol.keyFor(test1), Symbol.keyFor(test3))
Symbol作为内置的对象属性
- Symbol.iterator
- Symbol.hasInstance
- Symbol.isConcatSpreadable
- Symbol.match
- Symbol.replace
- Symbol.search
- Symbol.species
- Symbol.split
- Symbol.toPrimitive
- Symbol.toStringTag