es6解构支持字符串。ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构;通过解构赋值可以将属性值从对象/数组中取出赋值给其他变量。字符串也可以解构赋值,字符串会被转换成了一个类似数组的对象;类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

本教程操作环境:windows10系统、ECMAScript 6版、Dell G3电脑。
es6的解构是什么意思
destructuring:百度百科的意思是结构分解,ES6 中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
解构赋值语法是一种 Javascript 表达式,通过解构赋值可以将属性值从对象/数组中取出赋值给其他变量
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
开发中比较常见的有字符串解构、对象解构、 数组解构、混合解构。这是一种将数据结构分解为更小的部分的过程,从而达到简化提取信息的目的。
1. 基本数据类型解构
1-1 字符串解构赋值
字符串也可以解构赋值,字符串会被转换成了一个类似数组的对象
类似数组的对象都有一个length 属性,因此还可以对这个属性解构赋值
1 2 3 4 5 6 7 | let [a, b, c, d ,e] = 'hello' ;
console.log(a, b, c, d ,e);
let {length : num} = 'hello' ;
console.log(num);
|
登录后复制
1-2 数值、布尔值解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象
数值和布尔值的包装对象都有 toString 属性,变量都能取到值
1 2 3 4 5 | let {toString: s} = 123;
s === Number.prototype.toString
let {toString: s} = true ;
s === Boolean.prototype.toString
|
登录后复制
由于 undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错
1 2 | let { prop: x } = undefined;
let { prop: y } = null ;
|
登录后复制
2. 数组解构
2-1 基本用法
- 数组可以变量声明并赋值时解构,也可以在变量先声明后赋值时解构
1 2 3 4 5 6 7 8 9 10 11 | let arr = [ 'jsx' , 'ljj' , 'zdj' , 'ddc' ]
let [one, two, three, four] = arr;
console.log(one, two, three, four);
let name1, name2, name3, name4;
[name1, name2, name3, name4] = [ 'jsx' , 'ljj' , 'zdj' , 'ddc' ];
console.log(name1, name2, name3, name4);
|
登录后复制
2-2 完全解构
- 只要等号两边的模式相同,左边的变量就会被赋予对应的值
1 2 3 4 5 | let [one, two, three] = [ 'html' , 'css' , 'js' ];
console.log(one, two, three);
let [str1, [str2], str3] = [ 'jsx' , [ 'ljj' ], 'ddc' ]
console.log(str1, str2, str3);
|
登录后复制
1 2 3 4 5 | let [, , name] = [ 'haha' , 'xixi' , 'jsx' ];
console.log(name);
let [, xixi , ] = [ 'haha' , 'xixi' , 'jsx' ];
console.log(xixi);
|
登录后复制
- 当解构一个数组时,可以使用扩展语法 ...,将数组剩余部分赋值给一个变量
1 2 3 | let [num, ...numN] = [1, 2, 3, 4];
console.log(num);
console.log(numN);
|
登录后复制
- 交换变量值,在一个解构表达式中可以交换两个变量的值
1 2 3 4 5 | let name1 = 'jsx' ;
let name2 = 'ljj' ;
let name3 = 'ddc' ;
[name1, name2, name3] = [name3, name1, name2];
console.log(name1, name2, name3);
|
登录后复制
- 等号右侧可以是任何可迭代对象(具备 Iterator 接口对象或数组)
1 2 3 4 5 | let [a, b, c] = 'jsx' ;
console.log(a, b, c);
let [one1, two1, three1] = new Set([1, 2, 3]);
console.log(one1, two1, three1);
|
登录后复制
2-3 不完全解构
- 当等号左边的变量只匹配一部分的等号右边的数组,右边的数组多余元素会被忽略
1 2 3 4 5 | let [one, two] = [1, 2, 3];
console.log(one, two);
let [a, [b], c] = [1, [2, 3], 4]
console.log(a, b, c);
|
登录后复制
- 当等号左边的变量数量多于等号右边的数组元素,解构赋值左边多余的变量则为 undefined
1 2 | let [str1, str2] = [ 'jsx' ];
console.log(str1, str2);
|
登录后复制
- 扩展语法 ... 变量解构时匹配不到元素值时返回 [] 空数组
1 2 | let [str3, ...str4] = [ 'jsx' ];
console.log(str3, str4);
|
登录后复制
- 如果等号的右边不是数组,也不是可迭代对象,那么解构赋值将会报错
1 2 3 4 5 6 7 | let [foo1] = 1;
let [foo2] = false ;
let [foo3] = NaN;
let [foo4] = undefined;
let [foo5] = null ;
let [foo6] = {};
console.log(foo1, foo2, foo3, foo4, foo5, foo6);
|
登录后复制
2-4 默认值
- 数组解构时可以在表达式左边的数组中为任意对象预设默认值
1 2 | let [name1 = 'jsx' , name2 = 'ljj' ] = [];
console.log(name1, name2);
|
登录后复制
- ES6 内部使用严格相等运算符 === 判断一个位置是否有值,当一个数组缺少的值时,元素严格等于undefined,默认值才会生效
1 2 3 4 5 6 7 | let [num = 123] = [undefined];
console.log(num);
let [num1 = 123] = [ null ];
console.log(num1);
|
登录后复制
- 如果默认值是一个函数声明,函数声明是惰性求值的,只有在右边没有匹配值时才会执行
1 2 3 4 5 | function func() {
return 123
}
let [num2 = func()] = [undefined];
console.log(num2)
|
登录后复制
- 默认值可以引用解构赋值的其他变量,但该变量必须已经声明
1 2 3 4 | let [str1 = 'jsx' , str2 = str1] = [];
console.log(str1, str2);
let [str3 = str4, str4 = 'ljj' ] = [];
|
登录后复制
3. 对象解构
3-1 基本用法
1 | let {var1, var2} = {var1:…, var2:…}
|
登录后复制
1 2 3 4 5 6 7 8 | let { name, age } = { name: 'jsx' , age: 22 };
console.log(name, age);
let a, b;
({a, b} = {a: 1, b: 2});
console.log(a, b);
|
登录后复制
3-2 属性变量同名
- 对象的属性没有次序,左边的变量必须与对象属性同名,才能取到正确的值
1 2 | let {name, age} = {name: 'jsx' , age: 22};
console.log(name, age);
|
登录后复制
- 当变量没有对应的同名对象属性时,会导致1取不到值返回 undefined
1 2 3 | let {a, b} = {a: 'jsx' , c: 'ljj' };
console.log(a, b);
|
登录后复制
3-3 属性变量不同名
- 当变量名与对象属性名不一致时,可以使用冒号 : 来设置,将对象属性值赋值给 : 冒号后的变量
1 2 | let {user: name, age: num} = {user: 'jsx' , age: 22}
console.log(name, num);
|
登录后复制
- foo:baz 此时冒号前面 foo 则是匹配模式匹配对象属性,baz 则是匹配属性的值
1 2 3 | let {foo:baz} = {name: 'jsx' };
console.log(foo);
console.log(baz);
|
登录后复制
- 先找到同名属性,然后再赋给对应的变量,真正被赋值的是后者,而不是前者
1 2 | let {name: str, age: num1} = {user: 'jsx' , age: 22};
console.log(str, num1);
|
登录后复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | let obj = { lesson: [ 'html' , { class: 'css' }] }
let { lesson: [x, { class: y }] } = obj;
let { lesson } = obj;
console.log(lesson);
let obj1 = {};
let arr1 = [];
({ foo: obj1.prop, bar: arr1[0] } = { foo: 123, bar: true });
console.log(obj1)
console.log(arr1)
|
登录后复制
1 2 3 4 5 | let obj2 = {};
let obj3 = { user: 'ljj' };
Object.setPrototypeOf(obj2, obj3);
let { user } = obj2;
console.log(user);
|
登录后复制
- 可以使用扩展语法 ... 将对象剩余的属性与值赋值给一个变量
1 2 3 4 5 6 7 8 9 10 11 12 13 | let options = {
title: "Menu" ,
height: 200,
width: 100
};
let { title, ...rest } = options;
console.log(rest.height);
console.log(rest.width);
|
登录后复制
3-4 默认值
- 对象的解构也可以指定默认值,默认值生效的条件是对象的属性值严格等于undefined
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | let {name = 'jsx' } = {};
console.log(name);
let {name1 = 'jsx' } = {name1: 'ljj' };
console.log(name1);
let {name2 = 'jsx' } = {name2: undefined};
console.log(name2);
let {x: y = 3} = {x: 5};
console.log(y);
let {x1 = 3} = {x1: null };
console.log(x1);
|
登录后复制
- 当指定的对象属性不存在时,直接在变量后添加默认值
- 当指定的对象属性存在,而属性值不存在或者为 undefined 时,先匹配属性再在变量值后添加一个等号 = 和相应的默认值即可
1 2 | let {user: xm = 'jsx' } = {};
console.log(xm);
|
登录后复制
4. 嵌套解构
如果一个对象或数组嵌套了其他的对象和数组,我们可以在等号左侧使用更复杂的模式(pattern)来提取更深层的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | let [name, [name1, [name2]]] = [ 'jsx' , [ 'ljj' , [ 'ddc' ]]];
console.log(name, name1, name2);
let obj = {
title: '对象解构' ,
info: {
target: '对象' ,
difficulty: {
level: 1
}
}
}
let {
title,
info,
info: {
target,
difficulty,
difficulty: {
level
}
}
} = obj;
console.log(title, info, target, difficulty, level);
let objArr = {
message: '对象数组嵌套' ,
lesson: [ 'html' , 'css' , 'js' ],
news: {
main: '新消息'
}
}
let {
message,
lesson,
lesson: [item1, item2, item3],
news,
news: {
main
}
} = objArr;
console.log(message, lesson, item1, item2, item3, news, main)
|
登录后复制

5. 函数参数解构
一个函数可以有很多参数,其中大部分的参数都是可选的
- 把所有参数当作一个数组来传递,然后函数马上把这个数组解构成多个变量
1 2 3 4 | function arrFn([name, age]) {
console.log(name, age)
}
arrFn([ 'jsx' , 22]);
|
登录后复制
- 把所有参数当作一个对象来传递,然后函数马上把这个对象解构成多个变量
1 2 3 4 5 6 7 8 9 10 11 12 13 | let obj = {
title: "My menu" ,
items: [ "Item1" , "Item2" ]
}
function objFn({
title,
items: [item1, item2]
}) {
console.log(title);
console.log(item1, item2);
}
objFn(obj);
|
登录后复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | function ({
incomingProperty: varName = defaultValue
...
})
let obj1 = {
message: '嵌套带冒号' ,
info: {
name: 'jsx' ,
lesson: [ 'html' , 'css' ],
grilfriend: {
xm: 'ljj'
}
}
}
function complexFn({
message,
info: {
name,
lesson: [list1, list2],
grilfriend: {
xm
}
}
}) {
console.log(message);
console.log(list1, list2);
console.log(xm);
}
complexFn(obj1);
|
登录后复制
- 可以通过指定空对象 {} 为整个参数对象设置默认值
1 2 3 4 5 6 7 8 9 10 | function nullFn({
info = 'jsx' ,
width = 100,
height = 200
} = {}) {
console.log(info);
console.log(width);
console.log(height);
}
nullFn();
|
登录后复制
6. 圆括号问题
不可以使用圆括号的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | let [(num)] = [1];
console.log(a);
let {(name: str)} = {name: 'jsx' };
console.log(str);
function fn([(a)]) {
console.log(a);
}
fn(1);
let a, b;
([a, b]) = [1, 2];
console.log(a, b)
|
登录后复制
可以使用圆括号的情况:
1 2 3 4 5 6 7 | let num;
[(num)] = [123];
console.log(num);
let str;
({name: str} = {name: 'jsx' });
console.log(str);
|
登录后复制
7. 解构赋值使用场景
1 2 3 4 | let name1 = 'jsx' ;
let name2 = 'ljj' ;
[name1, name2] = [name2, name1];
console.log(name1, name2);
|
登录后复制
1 2 3 4 5 6 7 8 9 10 11 | function returnFn() {
return {
name: 'jsx' ,
age: 22
}
}
let {
name,
age
} = returnFn();
console.log(name, age);
|
登录后复制
1 2 3 4 5 6 7 8 9 10 | function argumentFn([list1, list2]) {
console.log(list1);
console.log(list2);
}
argumentFn([ 'jsx' , 'ljj' ])
function argumentFn1({obj}) {
console.log(obj);
}
argumentFn1({obj: 'jsx' })
|
登录后复制
1 2 3 4 5 6 7 8 9 10 11 | let jsonData = {
id: 42,
status: "OK" ,
data: [867, 5309]
};
let {
id,
status,
data: number
} = jsonData;
console.log(id, status, number);
|
登录后复制
1 2 3 4 | function func({ title = '默认值' } = {}) {
console.log(title)
}
func();
|
登录后复制
1 2 3 4 5 6 7 8 9 | const map = new Map();
map.set( 'first' , 'hello' );
map.set( 'second' , 'world' );
for (let [key, value] of map) {
console.log(key + " is " + value);
}
|
登录后复制
1 2 3 4 5 6 7 8 9 | let user = {
name: "John" ,
age: 30
};
for (let [key, value] of Object.entries(user)) {
console.log(`${key}: ${value}`);
}
|
登录后复制
1 2 3 4 5 | <script type= "module" >
import {sayHi, sayHello} from './index.js' ;
sayHi();
sayHello();
</script>
|
登录后复制
1 2 3 4 5 6 7 8 | export function sayHi() {
console.log( 'say hi' )
}
export function sayHello() {
console.log( 'say hello' )
}
|
登录后复制
【相关推荐:javascript视频教程、编程视频】
以上就是es6解构支持字符串吗的详细内容,更多请关注php中文网其它相关文章!