目录
1、 Symbol
ES5中包含5种原始类型:字符串、数字、布尔值、null和undefined
ES6引入了第6种原始类型——Symbol
凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
Symbol是原始值,ES6扩展了typeof操作符,返回"symbol"。
所以可以用typeof来检测变量是否为symbol类型
let name = Symbol('name');
let say = Symbol('say');
let obj = {
// 使用变量作为对象属性的名称,必须加上中括号
[name]: '草莓1',
[say]: function() {
console.log('say')
}
}
obj.name = '草莓2';
obj[Symbol('name')] = '草莓3'
console.log(obj)
打印结果:
{
name: '草莓2',
Symbol('name'): '草莓1',
Symbol('name'): '草莓3',
Symbol('say'): function() {
console.log('say')
}
}
2、Object.freeze()
Object.freeze() 方法可以冻结一个对象,一个被冻结的对象再也不能被修改。
被冻结的对象有以下几个特性:
- 不能添加新属性
- 不能删除已有属性
- 不能修改已有属性的值
- 不能修改原型
- 不能修改已有属性的可枚举性、可配置性、可写性
var obj = {
name: '小草莓',
age: 18,
address: '广东'
}
obj.__proto__.habit = '睡觉'
// 冻结对象
Object.freeze(obj)
// 不能添加新属性
obj.sex = '女'
console.log(obj) // { name: "小草莓", age: 18, address: "广东" }
// 不能删除原有属性
delete obj.age
console.log(obj) // { name: "小草莓", age: 18, address: "广东" }
// 不能修改已有属性的值
obj.name = '小草莓2号'
console.log(obj) // { name: "小草莓", age: 18, address: "广东" }
// 不能修改原型
obj.__proto__ = '随便什么值'
console.log(obj.__proto__)
// { habit: "睡觉", constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, …}
// 不能修改已有属性的可枚举性、可配置性、可写性
Object.defineProperty(obj, 'address', {
enumerable: false,
configurable: false,
writable: true
}) // TypeError: Cannot redefine property: address
3、正则表达式的一些规则
^ 匹配输入字符串的开始位置
\s 匹配任何空白字符,包括空格、制表符、换页符等
+ 匹配前面的子表达式一次或多次
$ 匹配输入字符串的结尾位置
\w 匹配包含下划线的所有字母和数字,与 [a-zA-Z0-9_] 等价
第一个 / 表示正则表达式的开始
最后一个 /g 是全局匹配模式(匹配在整个字符串都有效)
4、实现方法
/^\s+/ 一次或多次匹配字符串开始位置的任何空白字符
/\s+$/ 一次或多次匹配字符串结束位置的任何空白字符
/\w\s+\w/ 一次或多次匹配字符串中所有字母和数字中间的任何空白字符
/\s/g 全局匹配任何空白字符
$1$3 对应正则表达式的第一个和第三个匹配结果
// 去掉空格
var POSITION = Object.freeze({
left: Symbol(),
right: Symbol(),
both: Symbol(),
center: Symbol(),
all: Symbol()
})
/*
* str 字符串
position 要去除哪个位置的位置
*/
function trim(str, position = POSITION.both) {
switch (position) {
// 左边
case POSITION.left:
str = str.replace(/^\s+/, '')
break
// 右边
case POSITION.right:
str = str.replace(/\s+$/, '')
break
// 左边和右边
case POSITION.both:
str = str.replace(/^\s+/, '').replace(/\s+$/, '')
break
// 中间
case POSITION.center:
while (str.match(/\w\s+\w/)) {
str = str.replace(/(\w)(\s+)(\w)/, `$1$3`)
}
break
// 全部
case POSITION.all:
str = str.replace(/\s/g, '')
break
}
return str
}
打印结果:
var str = trim(' s t r ', POSITION.left)
console.log(`|${str}|`) // |s t r |
var str = trim(' s t r ', POSITION.right)
console.log(`|${str}|`) // | s t r|
var str = trim(' s t r ', POSITION.both)
console.log(`|${str}|`) // |s t r|
var str = trim(' s t r ', POSITION.center)
console.log(`|${str}|`) // | str |
var str = trim(' s t r ', POSITION.all)
console.log(`|${str}|`) // |str|