Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ES6 ±äÁ¿ÉùÃ÷Ó븳ֵ£ºÖµ´«µÝ¡¢Ç³¿½±´ÓëÉ±´Ïê½â
 
  2550  次浏览      27
  2019-5-31
 
±à¼­ÍƼö:
±¾ÎÄÀ´×Ô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=b=1;

µ«ÊÇÔÚÁ¬Ðø¸³ÖµÖУ¬»á·¢ÉúÒýÓñ£Áô£¬¿ÉÒÔ¿¼ÂÇÈçÏÂÇé¾°£º

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}

Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì

 
   
2550 ´Îä¯ÀÀ       27