《javascript高级程序设计》--第3章 语言基础

23 阅读3分钟

总结

本章主要是javascript最基础的部分,也是所有语言比较通用的一部分。

  1. 基础语法: 标识符、关键字、保留字 undefined不是保留字,意味着在代码中可以任意的修改
  2. 变量: var、let、const
  3. 数据类型: 6种原始值数据类型以及Object引用类型、以及数据的转换,其中包括了类型的转换,主要是Number类型和String类型,Symbol类型在平时的用的不多,主要是给内置对象使用的,在String对象中新增的字符串的操作方法都是使用的Symbol作为属性值。
  4. 操作符与基本语句: 除了常规的操作符之外,还有位运算,基本语句又包括判断语句以及循环语句。
  5. 函数: 简单的介绍了函数。

学到的新知识

  1. 模版字符串的标签函数
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}岁了`)

image.png

其实当数据不需要特殊处理的时候,是可以直接就使用常规的字符串,在日常的开发中,常用的做法是使用模版字符串之前就统一处理了数据,或者在${}里面简单的处理。

  1. String.raw 它的作用是将模板字符串不转义的原始字符串内容返回。 本质就是添加了一个\进行转义 String.raw是内置的一个模版字符串的标签函数
console.log(String.raw`这是第一段\n这是第二段`)
console.log(`这是第一段\n这是第二段`)

image.png

  1. Symbol类型

    Symbol是es6中新增的数据类型,使用symbol()会返回对应的值,symbol的特点就是生成的值是唯一的

const a = Symbol()
const b = Symbol()
console.log(a === b)

image.png

Symbol()方法可以传一个字符串作为这个Symbol的描述,但是描述不影响symbol的值

    const a = Symbol('test')
    const b = Symbol('test')
    console.log(a === b)

image.png

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))

image.png

命名冲突

多人协作时,不同的文件命名可能相同,当协作有交集时,相同的对象属性会产生冲突,使用Symbol保证了属性的唯一性,就能避免这个问题。

Symbol.for()与Symbol的keyFor()

用来创建和读取全局注册的Symbol值

Symbol.for()

创建全局注册的Symbol值,在创建之前会先查找是否存在,存在的话就直接返回,反之则进行创建。

const test1 = Symbol.for('test')
const test2 = Symbol.for('test')
console.log(test1 === test2)

image.png

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))

image.png

Symbol作为内置的对象属性

  1. Symbol.iterator
  2. Symbol.hasInstance
  3. Symbol.isConcatSpreadable
  4. Symbol.match
  5. Symbol.replace
  6. Symbol.search
  7. Symbol.species
  8. Symbol.split
  9. Symbol.toPrimitive
  10. Symbol.toStringTag