±à¼ÍƼö: |
±¾ÎÄÀ´×Ôcsdn£¬±¾ÎĽéÉÜ
ES6 Öг£ÓõÄÈýÖÖ±äÁ¿ÉùÃ÷·½Ê½£¬È»ºóÌÖÂÛÁË JavaScript °´Öµ´«µÝµÄÌØÐÔ£¬×îºó½éÉÜÁ˸´ºÏÀàÐÍ¿½±´µÄ¼¼ÇÉ¡£ |
|
±äÁ¿ÉùÃ÷Ó븳ֵ
ES6 ΪÎÒÃÇÒýÈëÁË let Óë const Á½ÖÖеıäÁ¿ÉùÃ÷¹Ø¼ü×Ö£¬Í¬Ê±Ò²ÒýÈëÁË¿é×÷ÓÃÓò£»±¾ÎÄÊ×ÏȽéÉÜ
ES6 Öг£ÓõÄÈýÖÖ±äÁ¿ÉùÃ÷·½Ê½£¬È»ºóÌÖÂÛÁË JavaScript °´Öµ´«µÝµÄÌØÐÔÒÔ¼°¶àÖֵĸ³Öµ·½Ê½£¬×îºó½éÉÜÁ˸´ºÏÀàÐÍ¿½±´µÄ¼¼ÇÉ¡£
±äÁ¿ÉùÃ÷
ÔÚ JavaScript ÖУ¬»ù±¾µÄ±äÁ¿ÉùÃ÷¿ÉÒÔÓà var ·½Ê½£»JavaScript ÔÊÐíÊ¡ÂÔ var£¬Ö±½Ó¶ÔδÉùÃ÷µÄ±äÁ¿¸³Öµ¡£Ò²¾ÍÊÇ˵£¬var
a = 1 Óë a = 1£¬ÕâÁ½ÌõÓï¾äµÄЧ¹ûÏàͬ¡£µ«ÊÇÓÉÓÚÕâÑùµÄ×ö·¨ºÜÈÝÒײ»Öª²»¾õµØ´´½¨È«¾Ö±äÁ¿£¨ÓÈÆäÊÇÔÚº¯ÊýÄÚ²¿£©£¬ËùÒÔ½¨Òé×ÜÊÇʹÓÃ
var ÃüÁîÉùÃ÷±äÁ¿¡£ÔÚ ES6 ÖУ¬¶ÔÓÚ±äÁ¿ÉùÃ÷µÄ·½Ê½½øÐÐÁËÀ©Õ¹£¬ÒýÈëÁË let Óë const¡£var
Óë let Á½¸ö¹Ø¼ü×Ö´´½¨±äÁ¿µÄÇø±ðÔÚÓÚ£¬ var ÉùÃ÷µÄ±äÁ¿×÷ÓÃÓòÊÇ×î½üµÄº¯Êý¿é£»¶ø let ÉùÃ÷µÄ±äÁ¿×÷ÓÃÓòÊÇ×î½üµÄ±ÕºÏ¿é£¬ÍùÍù»áСÓÚº¯Êý¿é¡£ÁíÒ»·½Ã棬ÒÔ
let ¹Ø¼ü×Ö´´½¨µÄ±äÁ¿ËäȻͬÑù±»ÌáÉýµ½×÷ÓÃÓòÍ·²¿£¬µ«ÊDz¢²»ÄÜÔÚʵ¼ÊÉùÃ÷ǰʹÓã»Èç¹ûÇ¿ÐÐʹÓÃÔò»áÅ׳ö
ReferenceError Òì³£¡£
var
var ÊÇ JavaScript Öлù´¡µÄ±äÁ¿ÉùÃ÷·½Ê½Ö®Ò»£¬Æä»ù±¾Ó﷨Ϊ:
var x; // Declaration
and initialization
x = "Hello World"; // Assignment
// Or all in one
var y = "Hello World"; |
ECMAScript 6 ÒÔǰÎÒÃÇÔÚ JavaScript Öв¢Ã»ÓÐÆäËûµÄ±äÁ¿ÉùÃ÷·½Ê½£¬ÒÔ var ÉùÃ÷µÄ±äÁ¿×÷ÓÃÓÚº¯Êý×÷ÓÃÓòÖУ¬Èç¹ûûÓÐÏàÓ¦µÄ±ÕºÏº¯Êý×÷ÓÃÓò£¬ÄÇô¸Ã±äÁ¿»á±»µ±×öĬÈϵÄÈ«¾Ö±äÁ¿½øÐд¦Àí¡£
function sayHello(){
var hello = "Hello World";
return hello;
}
console.log(hello); |
ÏñÈçÉÏÕâÖÖµ÷Ó÷½Ê½»áÅ׳öÒì³£: ReferenceError: hello
is not defined£¬ÒòΪ hello ±äÁ¿Ö»ÄÜ×÷ÓÃÓÚ sayHello º¯ÊýÖУ¬²»¹ýÈç¹û°´ÕÕÈçÏÂÏÈÉùÃ÷È«¾Ö±äÁ¿·½Ê½ÔÙʹÓÃʱ£¬Æä¾ÍÄܹ»Õý³£µ÷ÓÃ:
var hello =
"Hello World";
function sayHello(){
return hello;
}
console.log(hello); |
let
ÔÚ ECMAScript 6 ÖÐÎÒÃÇ¿ÉÒÔʹÓà let ¹Ø¼ü×Ö½øÐбäÁ¿ÉùÃ÷:
let x; // Declaration
and initialization
x = "Hello World"; // Assignment
// Or all in one
let y = "Hello World"; |
let ¹Ø¼ü×ÖÉùÃ÷µÄ±äÁ¿ÊÇÊôÓÚ¿é×÷ÓÃÓò£¬Ò²¾ÍÊǰüº¬ÔÚ {} Ö®ÄÚµÄ×÷ÓÃÓÚ¡£Ê¹Óà let ¹Ø¼ü×ÖµÄÓÅÊÆÔÚÓÚÄܹ»½µµÍżȻµÄ´íÎóµÄ¸ÅÂÊ£¬ÒòΪÆä±£Ö¤ÁËÿ¸ö±äÁ¿Ö»ÄÜÔÚ×îСµÄ×÷ÓÃÓòÄÚ½øÐзÃÎÊ¡£
var name = "Peter";
if(name === "Peter"){
let hello = "Hello Peter";
} else {
let hello = "Hi";
}
console.log(hello); |
ÉÏÊö´úÂëͬÑù»áÅ׳ö ReferenceError: hello is not defined Òì³££¬ÒòΪ
hello Ö»Äܹ»ÔڱպϵĿé×÷ÓÃÓòÖнøÐзÃÎÊ£¬ÎÒÃÇ¿ÉÒÔ½øÐÐÈçÏÂÐÞ¸Ä:
var name = "Peter";
if(name === "Peter"){
let hello = "Hello Peter";
console.log(hello);
} else {
let hello = "Hi";
console.log(hello);
} |
ÎÒÃÇ¿ÉÒÔÀûÓÃÕâÖÖ¿é¼¶×÷ÓÃÓòµÄÌØÐÔÀ´±ÜÃâ±Õ°üÖÐÒòΪ±äÁ¿±£Áô¶øµ¼ÖµÄÎÊÌ⣬ƩÈçÈçÏÂÁ½ÖÖÒì²½´úÂ룬ʹÓÃ
var ʱÿ´ÎÑ»·ÖÐʹÓõͼÊÇÏàͬ±äÁ¿£»¶øÊ¹Óà let ÉùÃ÷µÄ i Ôò»áÔÚÿ´ÎÑ»·Ê±½øÐв»Í¬µÄ°ó¶¨£¬¼´Ã¿´ÎÑ»·Öбհü²¶»ñµÄ¶¼ÊDz»Í¬µÄ
i ʵÀý£º
for(let i =
0;i < 2; i++){
setTimeout(()=>{console.log(`i:${i}`)},0);
}
for(var j = 0;j < 2; j++){
setTimeout(()=>{console.log(`j:${j}`)},0);
}
let k = 0;
for(k = 0;k < 2; k++){
setTimeout(()=>{console.log(`k:${k}`)},0);
}
// output
i:0
i:1
j:2
j:2
k:2
k:2 |
const
const ¹Ø¼ü×ÖÒ»°ãÓÃÓÚ³£Á¿ÉùÃ÷£¬Óà const ¹Ø¼ü×ÖÉùÃ÷µÄ³£Á¿ÐèÒªÔÚÉùÃ÷ʱ½øÐгõʼ»¯²¢ÇÒ²»¿ÉÒÔÔÙ½øÐÐÐ޸쬲¢ÇÒ
const ¹Ø¼ü×ÖÉùÃ÷µÄ³£Á¿±»ÏÞÖÆÓÚ¿é¼¶×÷ÓÃÓòÖнøÐзÃÎÊ¡£
function f()
{
{
let x;
{
// okay, block scoped name
const x = "sneaky";
// error, const
x = "foo";
}
// error, already declared in block
let x = "inner";
}
} |
JavaScript ÖÐ const ¹Ø¼ü×ֵıíÏÖÓÚ C ÖдæÔÚ×ÅÒ»¶¨²îÒ죬ƩÈçÏÂÊöʹÓ÷½Ê½ÔÚ JavaScript
ÖоÍÊÇÕýÈ·µÄ£¬¶øÔÚ C ÖÐÔòÅ׳öÒì³££º
# JavaScript
const numbers = [1, 2, 3, 4, 6]
numbers[4] = 5
console.log(numbers[4]) // print 5
# C
const int numbers[] = {1, 2, 3, 4, 6};
numbers[4] = 5; // error: read-only variable is
not assignable
printf("%d\n", numbers[4]); |
´ÓÉÏÊö¶Ô±ÈÎÒÃÇÒ²¿ÉÒÔ¿´³ö£¬JavaScript ÖÐ const ÏÞÖÆµÄ²¢·ÇÖµ²»¿É±äÐÔ£»¶øÊÇ´´½¨Á˲»¿É±äµÄ°ó¶¨£¬¼´¶ÔÓÚij¸öÖµµÄÖ»¶ÁÒýÓ㬲¢ÇÒ½ûÖ¹Á˶ÔÓÚ¸ÃÒýÓõÄÖØ¸³Öµ£¬¼´ÈçϵĴúÂë»á´¥·¢´íÎó£º
const numbers
= [1, 2, 3, 4, 6]
numbers = [7, 8, 9, 10, 11] // error: assignment
to constant variable
console.log(numbers[4]) |
ÎÒÃÇ¿ÉÒԲο¼ÈçÏÂͼƬÀí½âÕâÖÖ»úÖÆ£¬Ã¿¸ö±äÁ¿±êʶ·û¶¼»á¹ØÁªÄ³¸ö´æ·Å±äÁ¿Êµ¼ÊÖµµÄÎïÀíµØÖ·£»Ëùνֻ¶ÁµÄ±äÁ¿¼´ÊǸñäÁ¿±êʶ·û²»¿ÉÒÔ±»ÖØÐ¸³Öµ£¬¶ø¸Ã±äÁ¿Ö¸ÏòµÄÖµ»¹ÊǿɱäµÄ¡£
JavaScript ÖдæÔÚ×ÅËùνµÄÔʼÀàÐÍÓ븴ºÏÀàÐÍ£¬Ê¹Óà const ÉùÃ÷µÄÔʼÀàÐÍÊÇÖµ²»¿É±äµÄ£º
# Example 1
const a = 10
a = a + 1 // error: assignment to constant variable
# Example 2
const isTrue = true
isTrue = false // error: assignment to constant
variable
# Example 3
const sLower = 'hello world'
const sUpper = sLower.toUpperCase() // create
a new string
console.log(sLower) // print hello world
console.log(sUpper) // print HELLO WORLD |
¶øÈç¹ûÎÒÃÇÏ£Íû½«Ä³¸ö¶ÔÏóͬÑù±ä³É²»¿É±äÀàÐÍ£¬ÔòÐèҪʹÓà Object.freeze()£»²»¹ý¸Ã·½·¨½ö¶ÔÓÚ¼üÖµ¶ÔµÄ
Object Æð×÷Ó㬶øÎÞ·¨×÷ÓÃÓÚ Date¡¢Map Óë Set µÈÀàÐÍ£º
# Example 4
const me = Object.freeze({name: ¡°Jacopo¡±})
me.age = 28
console.log(me.age) // print undefined
# Example 5
const arr = Object.freeze([-1, 1, 2, 3])
arr[0] = 0
console.log(arr[0]) // print -1
# Example 6
const me = Object.freeze({
name: 'Jacopo',
pet: {
type: 'dog',
name: 'Spock'
}
})
me.pet.name = 'Rocky'
me.pet.breed = 'German Shepherd'
console.log(me.pet.name) // print Rocky
console.log(me.pet.breed) // print German Shepherd |
¼´Ê¹ÊÇ Object.freeze() Ò²Ö»ÄÜ·ÀÖ¹¶¥²ãÊôÐÔ±»Ð޸쬶øÎÞ·¨ÏÞÖÆ¶ÔÓÚǶÌ×ÊôÐÔµÄÐ޸ģ¬ÕâÒ»µãÎÒÃÇ»áÔÚÏÂÎĵÄdz¿½±´ÓëÉ±´²¿·Ö¼ÌÐøÌÖÂÛ¡£
±äÁ¿¸³Öµ
°´Öµ´«µÝ
JavaScript ÖÐÓÀÔ¶Êǰ´Öµ´«µÝ£¨pass-by-value£©£¬Ö»²»¹ýµ±ÎÒÃÇ´«µÝµÄÊÇij¸ö¶ÔÏóµÄÒýÓÃʱ£¬ÕâÀïµÄÖµÖ¸µÄÊǶÔÏóµÄÒýÓᣰ´Öµ´«µÝÖк¯ÊýµÄÐβÎÊDZ»µ÷ÓÃʱËù´«Êµ²ÎµÄ¸±±¾¡£ÐÞ¸ÄÐβεÄÖµ²¢²»»áÓ°Ïìʵ²Î¡£¶ø°´ÒýÓô«µÝ£¨pass-by-reference£©Ê±£¬º¯ÊýµÄÐβνÓÊÕʵ²ÎµÄÒþʽÒýÓ㬶ø²»ÔÙÊǸ±±¾¡£ÕâÒâζן¯ÊýÐβεÄÖµÈç¹û±»Ð޸ģ¬Êµ²ÎÒ²»á±»Ð޸ġ£Í¬Ê±Á½ÕßÖ¸ÏòÏàͬµÄÖµ¡£ÎÒÃÇÊ×ÏÈ¿´ÏÂ
C Öа´Öµ´«µÝÓëÒýÓô«µÝµÄÇø±ð£º
void Modify(int
p, int * q)
{
p = 27; // °´Öµ´«µÝ - pÊÇʵ²ÎaµÄ¸±±¾, Ö»ÓÐp±»ÐÞ¸Ä
*q = 27; // qÊÇbµÄÒýÓã¬qºÍb¶¼±»ÐÞ¸Ä
}
int main()
{
int a = 1;
int b = 1;
Modify(a, &b); // a °´Öµ´«µÝ, b °´ÒýÓô«µÝ,
// a δ±ä»¯, b ¸Ä±äÁË
return(0);
} |
¶øÔÚ JavaScript ÖУ¬¶Ô±ÈÀý×ÓÈçÏ£º
function changeStuff(a,
b, c)
{
a = a * 10;
b.item = "changed";
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);
// Êä³ö½á¹û
10
changed
unchanged |
JavaScript °´Öµ´«µÝ¾Í±íÏÖÓÚÔÚÄÚ²¿ÐÞ¸ÄÁË c µÄÖµµ«ÊDz¢²»»áÓ°Ïìµ½ÍⲿµÄ obj2 ±äÁ¿¡£Èç¹ûÎÒÃǸüÉîÈëµØÀ´Àí½âÕâ¸öÎÊÌ⣬JavaScript
¶ÔÓÚ¶ÔÏóµÄ´«µÝÔòÊǰ´¹²Ïí´«µÝµÄ£¨pass-by-sharing£¬Ò²½Ð°´¶ÔÏ󴫵ݡ¢°´¶ÔÏó¹²Ïí´«µÝ£©¡£×îÔçÓÉBarbara
Liskov. ÔÚ1974ÄêµÄGLUÓïÑÔÖÐÌá³ö£»¸ÃÇóÖµ²ßÂÔ±»ÓÃÓÚPython¡¢Java¡¢Ruby¡¢JSµÈ¶àÖÖÓïÑÔ¡£¸Ã²ßÂÔµÄÖØµãÊÇ£ºµ÷Óú¯Êý´«²Îʱ£¬º¯Êý½ÓÊܶÔÏóʵ²ÎÒýÓõĸ±±¾(¼È²»Êǰ´Öµ´«µÝµÄ¶ÔÏ󸱱¾£¬Ò²²»Êǰ´ÒýÓô«µÝµÄÒþʽÒýÓÃ)¡£
ËüºÍ°´ÒýÓô«µÝµÄ²»Í¬ÔÚÓÚ£ºÔÚ¹²Ïí´«µÝÖжԺ¯ÊýÐβεĸ³Öµ£¬²»»áÓ°Ïìʵ²ÎµÄÖµ¡£°´¹²Ïí´«µÝµÄÖ±½Ó±íÏÖ¾ÍÊÇÉÏÊö´úÂëÖеÄ
obj1£¬µ±ÎÒÃÇÔÚº¯ÊýÄÚÐÞ¸ÄÁË b Ö¸ÏòµÄ¶ÔÏóµÄÊôÐÔֵʱ£¬ÎÒÃÇʹÓà obj1 À´·ÃÎÊÏàͬµÄ±äÁ¿Ê±Í¬Ñù»áµÃµ½±ä»¯ºóµÄÖµ¡£
Á¬Ðø¸³Öµ
JavaScript ÖÐÊÇÖ§³Ö±äÁ¿µÄÁ¬Ðø¸³Öµ£¬¼´Æ©È磺
µ«ÊÇÔÚÁ¬Ðø¸³ÖµÖУ¬»á·¢ÉúÒýÓñ£Áô£¬¿ÉÒÔ¿¼ÂÇÈçÏÂÇé¾°£º
var a = {n:1};
a.x = a = {n:2};
alert(a.x); // --> undefined |
ΪÁ˽âÊÍÉÏÊöÎÊÌ⣬ÎÒÃÇÒýÈëÒ»¸öеıäÁ¿:
var a = {n:1};
var b = a; // ³ÖÓÐa£¬ÒԻزé
a.x = a = {n:2};
alert(a.x);// --> undefined
alert(b.x);// --> [object Object] |
ʵ¼ÊÉÏÔÚÁ¬Ðø¸³ÖµÖУ¬ÖµÊÇÖ±½Ó¸³Óè¸ø±äÁ¿Ö¸ÏòµÄÄÚ´æµØÖ·£º
a.x = a = {n:2}
©¦ ©¦
{n:1}<©¤©¤©¼ ©¸©¤>{n:2} |
Deconstruction: ½â¹¹¸³Öµ
½â¹¹¸³ÖµÔÊÐíÄãʹÓÃÀàËÆÊý×é»ò¶ÔÏó×ÖÃæÁ¿µÄÓï·¨½«Êý×éºÍ¶ÔÏóµÄÊôÐÔ¸³¸ø¸÷ÖÖ±äÁ¿¡£ÕâÖÖ¸³ÖµÓï·¨¼«¶È¼ò½à£¬Í¬Ê±»¹±È´«Í³µÄÊôÐÔ·ÃÎÊ·½·¨¸üΪÇåÎú¡£´«Í³µÄ·ÃÎÊÊý×éǰÈý¸öÔªËØµÄ·½Ê½Îª£º
var first =
someArray[0];
var second = someArray[1];
var third = someArray[2]; |
¶øÍ¨¹ý½â¹¹¸³ÖµµÄÌØÐÔ£¬¿ÉÒÔ±äΪ£º
var [first, second,
third] = someArray;
// === Arrays
var [a, b] = [1, 2];
console.log(a, b);
//=> 1 2
// Use from functions, only select from pattern
var foo = () => {
return [1, 2, 3];
};
var [a, b] = foo();
console.log(a, b);
// => 1 2
// Omit certain values
var [a, , b] = [1, 2, 3];
console.log(a, b);
// => 1 3
// Combine with spread/rest operator (accumulates
the rest of the values)
var [a, ...b] = [1, 2, 3];
console.log(a, b);
// => 1 [ 2, 3 ]
// Fail-safe.
var [, , , a, b] = [1, 2, 3];
console.log(a, b);
// => undefined undefined
// Swap variables easily without temp
var a = 1, b = 2;
[b, a] = [a, b];
console.log(a, b);
// => 2 1
// Advance deep arrays
var [a, [b, [c, d]]] = [1, [2, [[[3, 4], 5], 6]]];
console.log("a:", a, "b:",
b, "c:", c, "d:", d);
// => a: 1 b: 2 c: [ [ 3, 4 ], 5 ] d: 6
// === Objects
var {user: x} = {user: 5};
console.log(x);
// => 5
// Fail-safe
var {user: x} = {user2: 5};
console.log(x);
// => undefined
// More values
var {prop: x, prop2: y} = {prop: 5, prop2: 10};
console.log(x, y);
// => 5 10
// Short-hand syntax
var { prop, prop2} = {prop: 5, prop2: 10};
console.log(prop, prop2);
// => 5 10
// Equal to:
var { prop: prop, prop2: prop2} = {prop: 5, prop2:
10};
console.log(prop, prop2);
// => 5 10
// Oops: This doesn't work:
var a, b;
{ a, b } = {a: 1, b: 2};
// But this does work
var a, b;
({ a, b } = {a: 1, b: 2});
console.log(a, b);
// => 1 2
// This due to the grammar in JS.
// Starting with { implies a block scope, not
an object literal.
// () converts to an expression.
// From Harmony Wiki:
// Note that object literals cannot appear in
// statement positions, so a plain object
// destructuring assignment statement
// { x } = y must be parenthesized either
// as ({ x } = y) or ({ x }) = y.
// Combine objects and arrays
var {prop: x, prop2: [, y]} = {prop: 5, prop2:
[10, 100]};
console.log(x, y);
// => 5 100
// Deep objects
var {
prop: x,
prop2: {
prop2: {
nested: [ , , b]
}
}
} = { prop: "Hello", prop2: { prop2:
{ nested: ["a", "b", "c"]}}};
console.log(x, b);
// => Hello c
// === Combining all to make fun happen
// All well and good, can we do more? Yes!
// Using as method parameters
var foo = function ({prop: x}) {
console.log(x);
};
foo({invalid: 1});
foo({prop: 1});
// => undefined
// => 1
// Can also use with the advanced example
var foo = function ({
prop: x,
prop2: {
prop2: {
nested: b
}
}
}) {
console.log(x, ...b);
};
foo({ prop: "Hello", prop2: { prop2:
{ nested: ["a", "b", "c"]}}});
// => Hello a b c
// In combination with other ES2015 features.
// Computed property names
const name = 'fieldName';
const computedObject = { [name]: name }; // (where
object is { 'fieldName': 'fieldName' })
const { [name]: nameValue } = computedObject;
console.log(nameValue)
// => fieldName
// Rest and defaults
var ajax = function ({ url = "localhost",
port: p = 80}, ...data) {
console.log("Url:", url, "Port:",
p, "Rest:", data);
};
ajax({ url: "someHost" }, "additional",
"data", "hello");
// => Url: someHost Port: 80 Rest: [ 'additional',
'data', 'hello' ]
ajax({ }, "additional", "data",
"hello");
// => Url: localhost Port: 80 Rest: [ 'additional',
'data', 'hello' ]
// Ooops: Doesn't work (in traceur)
var ajax = ({ url = "localhost", port:
p = 80}, ...data) => {
console.log("Url:", url, "Port:",
p, "Rest:", data);
};
ajax({ }, "additional", "data",
"hello");
// probably due to traceur compiler
But this does:
var ajax = ({ url: url = "localhost",
port: p = 80}, ...data) => {
console.log("Url:", url, "Port:",
p, "Rest:", data);
};
ajax({ }, "additional", "data",
"hello");
// Like _.pluck
var users = [
{ user: "Name1" },
{ user: "Name2" },
{ user: "Name2" },
{ user: "Name3" }
];
var names = users.map( ({ user }) => user );
console.log(names);
// => [ 'Name1', 'Name2', 'Name2', 'Name3'
]
// Advanced usage with Array Comprehension and
default values
var users = [
{ user: "Name1" },
{ user: "Name2", age: 2 },
{ user: "Name2" },
{ user: "Name3", age: 4 }
];
[for ({ user, age = "DEFAULT AGE" }
of users) console.log(user, age)];
// => Name1 DEFAULT AGE
// => Name2 2
// => Name2 DEFAULT AGE
// => Name3 4 |
Êý×éÓëµü´úÆ÷
ÒÔÉÏÊÇÊý×é½â¹¹¸³ÖµµÄÒ»¸ö¼òµ¥Ê¾Àý£¬ÆäÓï·¨µÄÒ»°ãÐÎʽΪ£º
[ variable1,
variable2, ..., variableN ] = array; |
Õ⽫Ϊvariable1µ½variableNµÄ±äÁ¿¸³ÓèÊý×éÖÐÏàÓ¦ÔªËØÏîµÄÖµ¡£Èç¹ûÄãÏëÔÚ¸³ÖµµÄͬʱÉùÃ÷±äÁ¿£¬¿ÉÔÚ¸³ÖµÓï¾äǰ¼ÓÈëvar¡¢let»òconst¹Ø¼ü×Ö£¬ÀýÈ磺
var [ variable1,
variable2, ..., variableN ] = array;
let [ variable1, variable2, ..., variableN ] =
array;
const [ variable1, variable2, ..., variableN ]
= array; |
ÊÂʵÉÏ£¬ÓñäÁ¿À´ÃèÊö²¢²»Ç¡µ±£¬ÒòΪÄã¿ÉÒÔ¶ÔÈÎÒâÉî¶ÈµÄǶÌ×Êý×é½øÐн⹹£º
var [foo, [[bar],
baz]] = [1, [[2], 3]];
console.log(foo);
// 1
console.log(bar);
// 2
console.log(baz);
// 3 |
´ËÍ⣬Äã¿ÉÒÔÔÚ¶ÔӦλÁô¿ÕÀ´Ìø¹ý±»½â¹¹Êý×éÖеÄÄ³Ð©ÔªËØ£º
var [,,third]
= ["foo", "bar", "baz"];
console.log(third);
// "baz" |
¶øÇÒÄ㻹¿ÉÒÔͨ¹ý¡°²»¶¨²ÎÊý¡±Ä£Ê½²¶»ñÊý×éÖеÄËùÓÐÎ²ËæÔªËØ£º
var [head, ...tail]
= [1, 2, 3, 4];
console.log(tail);
// [2, 3, 4] |
µ±·ÃÎÊ¿ÕÊý×é»òÔ½½ç·ÃÎÊÊý×éʱ£¬¶ÔÆä½â¹¹Óë¶ÔÆäË÷ÒýµÄÐÐΪһÖ£¬×îÖյõ½µÄ½á¹û¶¼ÊÇ£ºundefined¡£
console.log([][0]);
// undefined
var [missing] = [];
console.log(missing);
// undefined |
Çë×¢Ò⣬Êý×é½â¹¹¸³ÖµµÄģʽͬÑùÊÊÓÃÓÚÈÎÒâµü´úÆ÷£º
function* fibs()
{
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
var [first, second, third, fourth, fifth, sixth]
= fibs();
console.log(sixth);
// 5 |
¶ÔÏó
ͨ¹ý½â¹¹¶ÔÏó£¬Äã¿ÉÒÔ°ÑËüµÄÿ¸öÊôÐÔÓ벻ͬµÄ±äÁ¿°ó¶¨£¬Ê×ÏÈÖ¸¶¨±»°ó¶¨µÄÊôÐÔ£¬È»ºó½ô¸úÒ»¸öÒª½â¹¹µÄ±äÁ¿¡£
var robotA =
{ name: "Bender" };
var robotB = { name: "Flexo" };
var { name: nameA } = robotA;
var { name: nameB } = robotB;
console.log(nameA);
// "Bender"
console.log(nameB);
// "Flexo" |
µ±ÊôÐÔÃûÓë±äÁ¿ÃûÒ»ÖÂʱ£¬¿ÉÒÔͨ¹ýÒ»ÖÖʵÓõľ䷨¼òд£º
var { foo, bar
} = { foo: "lorem", bar: "ipsum"
};
console.log(foo);
// "lorem"
console.log(bar);
// "ipsum" |
ÓëÊý×é½â¹¹Ò»Ñù£¬Äã¿ÉÒÔËæÒâǶÌײ¢½øÒ»²½×éºÏ¶ÔÏó½â¹¹£º
var complicatedObj
= {
arrayProp: [ "Zapp",
{ second: "Brannigan" }
]
};
var { arrayProp: [first, { second }] } = complicatedObj;
console.log(first);
// "Zapp"
console.log(second);
// "Brannigan" |
µ±Äã½â¹¹Ò»¸ö䶨ÒåµÄÊôÐÔʱ£¬µÃµ½µÄֵΪundefined£º
var { missing
} = {};
console.log(missing);
// undefined |
Çë×¢Ò⣬µ±Äã½â¹¹¶ÔÏ󲢸³Öµ¸ø±äÁ¿Ê±£¬Èç¹ûÄãÒѾÉùÃ÷»ò²»´òËãÉùÃ÷ÕâЩ±äÁ¿£¨Ò༴¸³ÖµÓï¾äǰûÓÐlet¡¢const»òvar¹Ø¼ü×Ö£©£¬ÄãÓ¦¸Ã×¢ÒâÕâÑùÒ»¸öDZÔÚµÄÓï·¨´íÎó£º
{ blowUp } =
{ blowUp: 10 };
// Syntax error Óï·¨´íÎó |
Ϊʲô»á³ö´í£¿ÕâÊÇÒòΪJavaScriptÓ﷨֪ͨ½âÎöÒýÇæ½«ÈκÎÒÔ{¿ªÊ¼µÄÓï¾ä½âÎöΪһ¸ö¿éÓï¾ä£¨ÀýÈ磬{console}ÊÇÒ»¸öºÏ·¨¿éÓï¾ä£©¡£½â¾ö·½°¸Êǽ«Õû¸ö±í´ïʽÓÃÒ»¶ÔСÀ¨ºÅ°ü¹ü£º
({ safe } =
{});
// No errors ûÓÐÓï·¨´íÎó |
ĬÈÏÖµ
µ±ÄãÒª½â¹¹µÄÊôÐÔ䶨ÒåʱÄã¿ÉÒÔÌṩһ¸öĬÈÏÖµ£º
var [missing
= true] = [];
console.log(missing);
// true
var { message: msg = "Something went wrong"
} = {};
console.log(msg);
// "Something went wrong"
var { x = 3 } = {};
console.log(x);
// 3 |
ÓÉÓڽ⹹ÖÐÔÊÐí¶Ô¶ÔÏó½øÐн⹹£¬²¢ÇÒ»¹Ö§³ÖĬÈÏÖµ£¬ÄÇôÍêÈ«¿ÉÒÔ½«½â¹¹Ó¦ÓÃÔÚº¯Êý²ÎÊýÒÔ¼°²ÎÊýµÄĬÈÏÖµÖС£
function removeBreakpoint({
url, line, column }) {
// ...
} |
µ±ÎÒÃǹ¹ÔìÒ»¸öÌṩÅäÖõĶÔÏ󣬲¢ÇÒÐèÒªÕâ¸ö¶ÔÏóµÄÊôÐÔЯ´øÄ¬ÈÏֵʱ£¬½â¹¹ÌØÐÔ¾ÍÅÉÉÏÓó¡ÁË¡£¾Ù¸öÀý×Ó£¬jQueryµÄajaxº¯ÊýʹÓÃÒ»¸öÅäÖöÔÏó×÷ΪËüµÄµÚ¶þ²ÎÊý£¬ÎÒÃÇ¿ÉÒÔÕâÑùÖØÐ´º¯Êý¶¨Ò壺
jQuery.ajax
= function (url, {
async = true,
beforeSend = noop,
cache = true,
complete = noop,
crossDomain = false,
global = true,
// ... ¸ü¶àÅäÖÃ
}) {
// ... do stuff
}; |
ͬÑù£¬½â¹¹Ò²¿ÉÒÔÓ¦ÓÃÔÚº¯ÊýµÄ¶àÖØ·µ»ØÖµÖУ¬¿ÉÒÔÀàËÆÓÚÆäËûÓïÑÔÖеÄÔª×éµÄÌØÐÔ£º
function returnMultipleValues()
{
return [1, 2];
}
var [foo, bar] = returnMultipleValues(); |
Three Dots
Rest Operator
ÔÚ JavaScript º¯Êýµ÷ÓÃʱÎÒÃÇÍùÍù»áʹÓÃÄÚÖÃµÄ arguments ¶ÔÏóÀ´»ñÈ¡º¯ÊýµÄµ÷ÓòÎÊý£¬²»¹ýÕâÖÖ·½Ê½È´´æÔÚןܶàµÄ²»·½±ãÐÔ¡£Æ©Èç
arguments ¶ÔÏóÊÇ Array-Like ¶ÔÏó£¬ÎÞ·¨Ö±½ÓÔËÓÃÊý×éµÄ .map() »òÕß .forEach()
º¯Êý£»²¢ÇÒÒòΪ arguments Êǰó¶¨ÓÚµ±Ç°º¯Êý×÷ÓÃÓò£¬Èç¹ûÎÒÃÇÏ£ÍûÔÚǶÌ׺¯ÊýÀïʹÓÃÍâ²ãº¯ÊýµÄ
arguments ¶ÔÏó£¬ÎÒÃÇ»¹ÐèÒª´´½¨Öмä±äÁ¿¡£
function outerFunction()
{
// store arguments into a separated variable
var argsOuter = arguments;
function innerFunction() {
// args is an array-like object
var even = Array.prototype.map.call(argsOuter,
function(item) {
// do something with argsOuter
});
}
} |
ES6 ÖÐΪÎÒÃÇÌṩÁË Rest Operator À´ÒÔÊý×éÐÎʽ»ñÈ¡º¯ÊýµÄµ÷ÓòÎÊý£¬Rest Operator
Ò²¿ÉÒÔÓÃÓÚÔڽ⹹¸³ÖµÖÐÒÔÊý×鷽ʽ»ñȡʣÓàµÄ±äÁ¿£º
function countArguments(...args)
{
return args.length;
}
// get the number of arguments
countArguments('welcome', 'to', 'Earth'); // =>
3
// destructure an array
let otherSeasons, autumn;
[autumn, ...otherSeasons] = cold;
otherSeasons // => ['winter'] |
µäÐ굀 Rest Operator µÄÓ¦Óó¡¾°Æ©Èç½øÐв»¶¨Êý×éµÄÖ¸¶¨ÀàÐ͹ýÂË£º
function filter(type,
...items) {
return items.filter(item => typeof item ===
type);
}
filter('boolean', true, 0, false); // => [true,
false]
filter('number', false, 4, 'Welcome', 7); // =>
[4, 7] |
¾¡¹Ü Arrow Function Öв¢Ã»Óж¨Òå arguments ¶ÔÏ󣬵«ÊÇÎÒÃÇÈÔÈ»¿ÉÒÔʹÓà Rest
Operator À´»ñÈ¡ Arrow Function µÄµ÷ÓòÎÊý£º
(function()
{
let outerArguments = arguments;
const concat = (...items) => {
console.log(arguments === outerArguments); //
=> true
return items.reduce((result, item) => result
+ item, '');
};
concat(1, 5, 'nine'); // => '15nine'
})(); |
Spread Operator
Spread Operator ÔòÓë Rest Opeator µÄ¹¦ÄÜÕýºÃÏà·´£¬Æä³£ÓÃÓÚ½øÐÐÊý×é¹¹½¨Óë½â¹¹¸³Öµ£¬Ò²¿ÉÒÔÓÃÓÚ½«Ä³¸öÊý×éת»¯Îªº¯ÊýµÄ²ÎÊýÁÐ±í£¬Æä»ù±¾Ê¹Ó÷½Ê½ÈçÏ£º
let cold = ['autumn',
'winter'];
let warm = ['spring', 'summer'];
// construct an array
[...cold, ...warm] // => ['autumn', 'winter',
'spring', 'summer']
// function arguments from an array
cold.push(...warm);
cold // => ['autumn', 'winter', 'spring', 'summer']
|
ÎÒÃÇÒ²¿ÉÒÔʹÓà Spread Operator À´¼ò»¯º¯Êýµ÷Óãº
class King {
constructor(name, country) {
this.name = name;
this.country = country;
}
getDescription() {
return `${this.name} leads ${this.country}`;
}
}
var details = ['Alexander the Great', 'Greece'];
var Alexander = new King(...details);
Alexander.getDescription(); // => 'Alexander
the Great leads Greece' |
»¹ÓÐÁíÍâÒ»¸öºÃ´¦¾ÍÊÇ¿ÉÒÔÓÃÀ´Ìæ»» Object.assign À´·½±ãµØ´Ó¾ÉÓеĶÔÏóÖд´½¨ÐµĶÔÏ󣬲¢ÇÒÄܹ»Ð޸IJ¿·ÖÖµ£»Æ©È磺
var obj = {a:1,b:2}
var obj_new_1 = Object.assign({},obj,{a:3});
var obj_new_2 = {
...obj,
a:3
} |
×îºóÎÒÃÇ»¹ÐèÒªÌÖÂÛÏ Spread Operator Óë Iteration Protocols£¬Êµ¼ÊÉÏ
Spread Operator Ò²ÊÇʹÓÃµÄ Iteration Protocols À´½øÐÐÔªËØ±éÀúÓë½á¹ûËѼ¯£»Òò´ËÎÒÃÇÒ²¿ÉÒÔͨ¹ý×Ô¶¨Òå
Iterator µÄ·½Ê½À´¿ØÖÆ Spread Operator µÄ±íÏÖ¡£Iterable ÐÒ鹿¶¨Á˶ÔÏó±ØÐë°üº¬
Symbol.iterator ·½·¨£¬¸Ã·½·¨·µ»ØÄ³¸ö Iterator ¶ÔÏó£º
interface Iterable
{
[Symbol.iterator]() {
//...
return Iterator;
}
} |
¸Ã Iterator ¶ÔÏó´ÓÊôÓÚ Iterator Protocol£¬ÆäÐèÒªÌṩ next ³ÉÔ±·½·¨£¬¸Ã·½·¨»á·µ»ØÄ³¸ö°üº¬
done Óë value ÊôÐԵĶÔÏó£º
interface Iterator
{
next() {
//...
return {
value: <value>,
done: <boolean>
};
};
} |
µäÐ굀 Iterable ¶ÔÏó¾ÍÊÇ×Ö·û´®£º
var str = 'hi';
var iterator = str[Symbol.iterator]();
iterator.toString(); // => '[object String
Iterator]'
iterator.next(); // => { value: 'h', done:
false }
iterator.next(); // => { value: 'i', done:
false }
iterator.next(); // => { value: undefined,
done: true }
[...str]; // => ['h', 'i'] |
ÎÒÃÇ¿ÉÒÔͨ¹ý×Ô¶¨Òå array-like ¶ÔÏóµÄ Symbol.iterator ÊôÐÔÀ´¿ØÖÆÆäÔÚµü´úÆ÷ÉϵÄЧ¹û£º
function iterator()
{
var index = 0;
return {
next: () => ({ // Conform to Iterator protocol
done : index >= this.length,
value: this[index++]
})
};
}
var arrayLike = {
0: 'Cat',
1: 'Bird',
length: 2
};
// Conform to Iterable Protocol
arrayLike[Symbol.iterator] = iterator;
var array = [...arrayLike];
console.log(array); // => ['Cat', 'Bird'] |
arrayLike[Symbol.iterator] Ϊ¸Ã¶ÔÏó´´½¨ÁËֵΪij¸öµü´úÆ÷µÄÊôÐÔ£¬´Ó¶øÊ¹¸Ã¶ÔÏó·ûºÏÁË
Iterable ÐÒ飻¶ø iterator() ÓÖ·µ»ØÁ˰üº¬ next ³ÉÔ±·½·¨µÄ¶ÔÏó£¬Ê¹µÃ¸Ã¶ÔÏó×îÖÕ¾ßÓкÍÊý×éÏàËÆµÄÐÐΪ±íÏÖ¡£
Copy Composite Data Types: ¸´ºÏÀàÐ͵Ŀ½±´
Shallow Copy: dz¿½±´
¶¥²ãÊôÐÔ±éÀú
dz¿½±´ÊÇÖ¸¸´ÖƶÔÏóµÄʱºò£¬Ö¸¶ÔµÚÒ»²ã¼üÖµ¶Ô½øÐжÀÁ¢µÄ¸´ÖÆ¡£Ò»¸ö¼òµ¥µÄʵÏÖÈçÏ£º
// dz¿½±´ÊµÏÖ
function shadowCopy(target, source){
if( !source || typeof source !== 'object'){
return;
}
// Õâ¸ö·½·¨ÓеãСtrick£¬targetÒ»¶¨µÃÊÂÏȶ¨ÒåºÃ£¬²»È»¾Í²»Äܸıäʵ²ÎÁË¡£
// ¾ßÌåÔÒò½âÊÍ¿ÉÒÔ¿´²Î¿¼×ÊÁÏÖÐ JSÊÇÖµ´«µÝ»¹ÊÇÒýÓô«µÝ
if( !target || typeof target !== 'object'){
return;
}
// Õâ±ß×îºÃÇø±ðһ϶ÔÏóºÍÊý×éµÄ¸´ÖÆ
for(var key in source){
if(source.hasOwnProperty(key)){
target[key] = source[key];
}
}
}
//²âÊÔÀý×Ó
var arr = [1,2,3];
var arr2 = [];
shadowCopy(arr2, arr);
console.log(arr2);
//[1,2,3]
var today = {
weather: 'Sunny',
date: {
week: 'Wed'
}
}
var tomorrow = {};
shadowCopy(tomorrow, today);
console.log(tomorrow);
// Object {weather: "Sunny", date: Object} |
Object.assign
Object.assign() ·½·¨¿ÉÒÔ°ÑÈÎÒâ¶à¸öµÄÔ´¶ÔÏóËùÓµÓеÄ×ÔÉí¿Éö¾ÙÊôÐÔ¿½±´¸øÄ¿±ê¶ÔÏó£¬È»ºó·µ»ØÄ¿±ê¶ÔÏó¡£Object.assign
·½·¨Ö»»á¿½±´Ô´¶ÔÏó×ÔÉíµÄ²¢ÇÒ¿Éö¾ÙµÄÊôÐÔµ½Ä¿±ê¶ÔÏóÉíÉÏ¡£×¢Ò⣬¶ÔÓÚ·ÃÎÊÆ÷ÊôÐÔ£¬¸Ã·½·¨»áÖ´ÐÐÄǸö·ÃÎÊÆ÷ÊôÐÔµÄ
getter º¯Êý£¬È»ºó°ÑµÃµ½µÄÖµ¿½±´¸øÄ¿±ê¶ÔÏó£¬Èç¹ûÄãÏ뿽±´·ÃÎÊÆ÷ÊôÐÔ±¾Éí£¬ÇëʹÓà Object.getOwnPropertyDescriptor()
ºÍObject.defineProperties() ·½·¨¡£
×¢Ò⣬×Ö·û´®ÀàÐÍºÍ symbol ÀàÐ͵ÄÊôÐÔ¶¼»á±»¿½±´¡£
×¢Ò⣬ÔÚÊôÐÔ¿½±´¹ý³ÌÖпÉÄÜ»á²úÉúÒì³££¬±ÈÈçÄ¿±ê¶ÔÏóµÄij¸öÖ»¶ÁÊôÐÔºÍÔ´¶ÔÏóµÄij¸öÊôÐÔͬÃû£¬Õâʱ¸Ã·½·¨»áÅ׳öÒ»¸ö
TypeError Òì³££¬¿½±´¹ý³ÌÖжϣ¬ÒѾ¿½±´³É¹¦µÄÊôÐÔ²»»áÊܵ½Ó°Ï죬»¹Î´¿½±´µÄÊôÐÔ½«²»»áÔÙ±»¿½±´¡£
×¢Ò⣬ Object.assign »áÌø¹ýÄÇЩֵΪ null »ò undefined µÄÔ´¶ÔÏó¡£
Object.assign(target,
...sources) |
Àý×Ó£ºÇ³¿½±´Ò»¸ö¶ÔÏó
var obj = {
a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 } |
Àý×Ó£ººÏ²¢Èô¸É¸ö¶ÔÏó
var o1 = { a:
1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, ×¢ÒâÄ¿±ê¶ÔÏó×ÔÉíÒ²»á¸Ä±ä¡£ |
Àý×Ó£º¿½±´ symbol ÀàÐ͵ÄÊôÐÔ
var o1 = { a:
1 };
var o2 = { [Symbol("foo")]: 2 };
var obj = Object.assign({}, o1, o2);
console.log(obj); // { a: 1, [Symbol("foo")]:
2 } |
Àý×Ó£º¼Ì³ÐÊôÐԺͲ»¿Éö¾ÙÊôÐÔÊDz»ÄÜ¿½±´µÄ
var obj = Object.create({foo:
1}, { // foo ÊǸö¼Ì³ÐÊôÐÔ¡£
bar: {
value: 2 // bar ÊǸö²»¿Éö¾ÙÊôÐÔ¡£
},
baz: {
value: 3,
enumerable: true // baz ÊǸö×ÔÉí¿Éö¾ÙÊôÐÔ¡£
}
});
var copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 } |
Àý×Ó£ºÔʼֵ»á±»Òþʽת»»³ÉÆä°ü×°¶ÔÏó
var v1 = "123";
var v2 = true;
var v3 = 10;
var v4 = Symbol("foo")
var obj = Object.assign({}, v1, null, v2, undefined,
v3, v4);
// Ô´¶ÔÏóÈç¹ûÊÇÔʼֵ£¬»á±»×Ô¶¯×ª»»³ÉËüÃǵİü×°¶ÔÏó£¬
// ¶ø null ºÍ undefined ÕâÁ½ÖÖÔʼֵ»á±»ÍêÈ«ºöÂÔ¡£
// ×¢Ò⣬ֻÓÐ×Ö·û´®µÄ°ü×°¶ÔÏó²ÅÓпÉÄÜÓÐ×ÔÉí¿Éö¾ÙÊôÐÔ¡£
console.log(obj); // { "0": "1",
"1": "2", "2": "3"
} |
Àý×Ó£º¿½±´ÊôÐÔ¹ý³ÌÖз¢ÉúÒì³£
var target =
Object.defineProperty({}, "foo", {
value: 1,
writeable: false
}); // target µÄ foo ÊôÐÔÊǸöÖ»¶ÁÊôÐÔ¡£
Object.assign(target, {bar: 2}, {foo2: 3, foo:
3, foo3: 3}, {baz: 4});
// TypeError: "foo" is read-only
// ×¢ÒâÕâ¸öÒì³£ÊÇÔÚ¿½±´µÚ¶þ¸öÔ´¶ÔÏóµÄµÚ¶þ¸öÊôÐÔʱ·¢ÉúµÄ¡£
console.log(target.bar); // 2£¬ËµÃ÷µÚÒ»¸öÔ´¶ÔÏó¿½±´³É¹¦ÁË¡£
console.log(target.foo2); // 3£¬ËµÃ÷µÚ¶þ¸öÔ´¶ÔÏóµÄµÚÒ»¸öÊôÐÔÒ²¿½±´³É¹¦ÁË¡£
console.log(target.foo); // 1£¬Ö»¶ÁÊôÐÔ²»Äܱ»¸²¸Ç£¬ËùÒÔµÚ¶þ¸öÔ´¶ÔÏóµÄµÚ¶þ¸öÊôÐÔ¿½±´Ê§°ÜÁË¡£
console.log(target.foo3); // undefined£¬Òì³£Ö®ºó assign
·½·¨¾ÍÍ˳öÁË£¬µÚÈý¸öÊôÐÔÊDz»»á±»¿½±´µ½µÄ¡£
console.log(target.baz); // undefined£¬µÚÈý¸öÔ´¶ÔÏó¸üÊDz»»á±»¿½±´µ½µÄ¡£
|
ʹÓà [].concat À´¸´ÖÆÊý×é
ͬÑùÀàËÆÓÚ¶ÔÓÚ¶ÔÏóµÄ¸´ÖÆ£¬ÎÒÃǽ¨ÒéʹÓÃ[].concatÀ´½øÐÐÊý×éµÄÉî¸´ÖÆ:
var list = [1,
2, 3];
var changedList = [].concat(list);
changedList[1] = 2;
list === changedList; // false |
ͬÑùµÄ£¬concat·½·¨Ò²Ö»Äܱ£Ö¤Ò»²ãÉî¸´ÖÆ:
> list =
[[1,2,3]]
[ [ 1, 2, 3 ] ]
> new_list = [].concat(list)
[ [ 1, 2, 3 ] ]
> new_list[0][0] = 4
4
> list
[ [ 4, 2, 3 ] ] |
dz¿½±´µÄȱÏÝ
²»¹ýÐèҪעÒâµÄÊÇ£¬assignÊÇdz¿½±´£¬»òÕß˵£¬ËüÊÇÒ»¼¶É±´£¬¾ÙÁ½¸öÀý×Ó˵Ã÷£º
const defaultOpt
= {
title: {
text: 'hello world',
subtext: 'It\'s my world.'
}
};
const opt = Object.assign({}, defaultOpt, {
title: {
subtext: 'Yes, your world.'
}
});
console.log(opt);
// Ô¤ÆÚ½á¹û
{
title: {
text: 'hello world',
subtext: 'Yes, your world.'
}
}
// ʵ¼Ê½á¹û
{
title: {
subtext: 'Yes, your world.'
}
} |
ÉÏÃæÕâ¸öÀý×ÓÖУ¬¶ÔÓÚ¶ÔÏóµÄÒ»¼¶×ÓÔªËØ¶øÑÔ£¬Ö»»áÌæ»»ÒýÓ㬶ø²»»á¶¯Ì¬µÄÌí¼ÓÄÚÈÝ¡£ÄÇô£¬Æäʵassign²¢Ã»Óнâ¾ö¶ÔÏóµÄÒýÓûìÂÒÎÊÌ⣬²Î¿¼ÏÂÏÂÃæÕâ¸öÀý×Ó£º
const defaultOpt
= {
title: {
text: 'hello world',
subtext: 'It\'s my world.'
}
};
const opt1 = Object.assign({}, defaultOpt);
const opt2 = Object.assign({}, defaultOpt);
opt2.title.subtext = 'Yes, your world.';
console.log('opt1:');
console.log(opt1);
console.log('opt2:');
console.log(opt2);
// ½á¹û
opt1:
{
title: {
text: 'hello world',
subtext: 'Yes, your world.'
}
}
opt2:
{
title: {
text: 'hello world',
subtext: 'Yes, your world.'
}
} |
DeepCopy: É±´
µÝ¹éÊôÐÔ±éÀú
Ò»°ãÀ´Ëµ£¬ÔÚJavaScriptÖп¼ÂǸ´ºÏÀàÐ͵ÄÉî²ã¸´ÖƵÄʱºò£¬ÍùÍù¾ÍÊÇÖ¸¶ÔÓÚDate¡¢ObjectÓëArrayÕâÈý¸ö¸´ºÏÀàÐ͵Ĵ¦Àí¡£ÎÒÃÇÄÜÏëµ½µÄ×î³£Óõķ½·¨¾ÍÊÇÏÈ´´½¨Ò»¸ö¿ÕµÄжÔÏó£¬È»ºóµÝ¹é±éÀú¾É¶ÔÏó£¬Ö±µ½·¢ÏÖ»ù´¡ÀàÐ͵Ä×Ó½Úµã²Å¸³Ó赽жÔÏó¶ÔÓ¦µÄλÖᣲ»¹ýÕâÖÖ·½·¨»á´æÔÚÒ»¸öÎÊÌ⣬¾ÍÊÇJavaScriptÖдæÔÚ×ÅÉñÆæµÄÔÐÍ»úÖÆ£¬²¢ÇÒÕâ¸öÔÐÍ»áÔÚ±éÀúµÄʱºò³öÏÖ£¬È»ºóÔÐͲ»Ó¦¸Ã±»¸³Óè¸øÐ¶ÔÏó¡£ÄÇôÔÚ±éÀúµÄ¹ý³ÌÖУ¬ÎÒÃÇÓ¦¸Ã¿¼ÂÇʹÓÃhasOenProperty·½·¨À´¹ýÂ˵ôÄÇЩ¼Ì³Ð×ÔÔÐÍÁ´ÉϵÄÊôÐÔ£º
function clone(obj)
{
var copy;
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof
obj) return obj;
// Handle Date
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
copy = [];
for (var i = 0, len = obj.length; i < len;
i++) {
copy[i] = clone(obj[i]);
}
return copy;
}
// Handle Object
if (obj instanceof Object) {
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
}
return copy;
}
throw new Error("Unable to copy obj! Its
type isn't supported.");
} |
µ÷ÓÃÈçÏ£º
// This would
be cloneable:
var tree = { "left" : { "left"
: null, "right" : null, "data"
: 3 }, "right" : null, "data"
: 8
};
// This would kind-of work, but you would get
2 copies of the
// inner node instead of 2 references to the same
copy
var directedAcylicGraph = { "left"
: { "left" : null, "right"
: null, "data" : 3 }, "data"
: 8
};
directedAcyclicGraph["right"] = directedAcyclicGraph["left"];
// Cloning this would cause a stack overflow due
to infinite recursion:
var cylicGraph = { "left" : { "left"
: null, "right" : null, "data"
: 3 }, "data" : 8
};
cylicGraph["right"] = cylicGraph; |
ÀûÓà JSON É±´
JSON.parse(JSON.stringify(obj)); |
¶ÔÓÚÒ»°ãµÄÐèÇóÊÇ¿ÉÒÔÂú×ãµÄ£¬µ«ÊÇËüÓÐȱµã¡£ÏÂÀýÖУ¬¿ÉÒÔ¿´µ½JSON¸´ÖÆ»áºöÂÔµôֵΪundefinedÒÔ¼°º¯Êý±í´ïʽ¡£
var obj = {
a: 1,
b: 2,
c: undefined,
sum: function() { return a + b; }
};
var obj2 = JSON.parse(JSON.stringify(obj));
console.log(obj2);
//Object {a: 1, b: 2} |
|