判断数据类型
1. typeof
- 问题: 只能检测基本数据类型
2.
constructor - 语法: 数据结构.constructor
- 问题: null 和 undefined 不能使用
- 使用场景: 一般用于引用数据类型
- 潜在问题: 这是原型对象的某一个属性, 我们是可以手动更改的
Object.prototype.toString.call(要检测的数据)
- 返回值: [object 数据类型] (字符串格式的, 并且数据类型的首字母是大写)
- 使用场景: 任意类型都可准确判断, 所以大部分情况下都可以使用
function Person () {}
const p1 = new Person()
console.log(Person.prototype)
console.log(p1.constructor)
console.log(p1.constructor === Person)
/**
* 1. 先在对象自身查找, 如果找到直接使用, 如果没找到, 会去对象的 __proto__ 内部查找
*
* 2. 相当于去了 Person 的 prototype 内部查找
*/
// console.log([].constructor === Array)
// console.log(null.constructor === Array) // 会报错, 不能使用
// console.log(undefined.constructor === Array) // 会报错, 不能使用
// console.log({}.constructor === Array) // 会报错, 不能使用
// console.log(Object.prototype.toString.call([]))
// console.log(Object.prototype.toString.call({}))
// console.log(Object.prototype.toString.call(null))
// console.log(Object.prototype.toString.call(undefined))
// console.log(Object.prototype.toString.call(''))
// console.log(Object.prototype.toString.call(100))
ES6类的语法
ES5 构造函数的问题:
-
- 构造函数 不加 new 也能使用, 只是没有意义
-
- 构造函数与原型上的内容 需要分开书写
// function person() {
// this.a = 123
// this.abc = 456
// }
// Person.prototype.init = function () { }
// let p = person()
// console.log(p) // person ? {} ? null? undefined? '' 123
// console.log(window)
// ES6 类的书写
class Stu {
// 构造器, 类似于 ES5 构造函数的函数体
constructor(num) {
this.name = '张三'
this.age = num
}
// 接下来的位置全都是 原型的书写位置
init() {
console.log('我是 原型上的 init 方法')
}
abc() {
console.log('我是 原型上的 abc 方法')
}
move() {
console.log('我是 原型上的 move 方法')
}
}
// const s1 = new Stu(18)
// console.log(s1)
// const s2 = new Stu(168)
// console.log(s2)
// s1.init()
// s2.move()
const s3 = Stu(99)
console.log(s3)
- 模板字符串
- 在 ES5 中要么是 单引号包裹要么是双引号包裹
- 而 ES6 中推出的 模板字符串是 使用 `` 反引号包裹的
和之前的区别
- 反引号能够换行, 但是单引号双引号不行
- 内部如果书写的 有 ${} 然后在内部可以识别出变量
- 展开运算符
- 在 ES6 推出了展开运算符 ...
- 能够展开数组 或者 对象
- 对象的简写语法
- 当对象的 key 与 value 相同的时候, 并且 value 是一个变量
- 那么可以省略其中一个不写
// let arr = [1, 2, 3]
// console.log(arr) //[1, 2, 3]
// console.log(...arr)
// 2.1 合并数组
// let arr2 = [...arr, 100, 101, 102]
// console.log(arr2)
// 2.2 函数传参
// function fn(a, b, c) {
// console.log('fn 函数的 形参: ', a, b, c)
// }
// fn(arr[0], arr[1], arr[2])
// fn(...arr)
// 2.3 展开对象
// let obj = {
// a: 1,
// b: 2
// }
// // console.log(...obj) 这个代码不符合语法规范
// let obj2 = {
// ...obj,
// c: 100,
// d: 200
// }
// console.log(obj2)
let name = '张三'
let obj = {
// name: '张三'
// name: name
name,
age: 100,
fn: function () {
console.log('我是对象obj 属性 fn 的属性值')
},
fn1() {
console.log('我是 fn1 函数')
}
}
// console.log(obj)
obj.fn()
obj.fn1()