[关闭]
@bluexiaowei 2016-05-26T05:41:52.000000Z 字数 4426 阅读 669

JavaScript —— 12 个小技巧

javascript小技巧


原文出处: @Caio Ribeiro Pereira
译文出处:w3cplus-大漠
降级理解:bluexiaowei


1. 比较符 !!

!!value 等于 "Boolean( value )" 只要变量不等于 0 -0 "" null undefined NaN false 返回的都是 true;

  1. var value = 0;
  2. console.log( !!value ); // false
  3. var value = -0;
  4. console.log( !!value ); // false
  5. var value = "";
  6. console.log( !!value ); // false
  7. var value = null;
  8. console.log( !!value ); // false
  9. var value = undefined;
  10. console.log( !!value ); // false
  11. var value = NaN;
  12. console.log( !!value ); // false
  13. var value = false;
  14. console.log( !!value ); // false
  15. var value = 1;
  16. console.log( !!value ); // true

2. 运算符 +

+value 等同于 Number( value ),只有数字类型的字符串能正常转换其余的都是 NaN

  1. var value = "123";
  2. console.log( +value ); //123
  3. var value = "123.234";
  4. console.log( +value ); //123.234
  5. var value = "123.5g";
  6. console.log( +value ); //NaN

3. 循环中用缓存 length——优化重复计算数组长度

循环数组,每次迭代都将会重新计算数组的 array.length 。所以 var length = array.length 保存数组长度,不进行重复计算数组长度。

  1. var length = array.length
  2. for ( var i = 0; i < length; i++ ) {
  3. console.log(array[i]);
  4. }

4. in 的用法。

(1): 当 key in Arraykey 是索引值;
(2): 当 key in Objectkey 是对象属性;

  1. var array = [ 1, 2, 3, 4, 5 ];
  2. console.log( "b" in array ); // false
  3. console.log( 2 in array ); // true
  4. console.log( "2" in array ); // true
  5. var object = { b: "is me", c: "is he", d: "is she" };
  6. console.log( "b" in object ); // true
  7. var array = [ 1, 2, 3, 4, 5 ];
  8. for ( var key in array ) {
  9. console.log( key + ":" + array[key] );
  10. }
  11. // 0: 1;
  12. // 1: 2;
  13. // 2: 3;
  14. // 3: 4;
  15. // 4: 5;
  16. var object = { b: "is me", c: "is he", d: "is she" };
  17. for ( var key in array ) {
  18. console.log( key + ":" + object[key] );
  19. }
  20. // b: "is me";
  21. // c: "is he";
  22. // d: "is she";

5. 数组截取——从后向前 slice()

array.slice( [start], [end] ) 从已有的数组中截取选定的元素。“截头不截尾”。
start 为负数则从尾部开始截取。 end 不支持负数。

  1. var arr, array = [ 1, 2, 3, 4, 5, 6 ];
  2. arr = array.slice();
  3. console.log( arr ); //[ 1, 2, 3, 4, 5, 6 ]
  4. arr = array.slice( 2, 5 );
  5. console.log( arr ); //[ 3, 4, 5 ]
  6. arr = array.slice( -2, 5 );
  7. console.log( arr ); //[ 5 ]
  8. arr = array.slice( -2, -1 );
  9. console.log( arr ); //[ ]
  10. arr = array.slice( -3 );
  11. console.log( arr ); //[ 4, 5, 6 ]

6. 数组的截断 array.length = value

  1. var array = [1, 2, 3, 4, 5, 6];
  2. console.log( array.length ); //5
  3. array.length = 3;
  4. console.log( array ); //[1, 2, 3, 4];

7. 字符串替换所有 string.replce()

string.replace(searchvalue,newvalue) 在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
匹配字符串中相同的:serchvalue: RegExp/string 将相同的替换为 newvalue: value

  1. var string = "john john";
  2. console.log( string.replace( /hn/, "ana" ) ); // "joana john"
  3. console.log( string.replace( /hn/g, "ana" ) ); // "joana joana"
  4. console.log( string.replace( "john", "ana" ) ); // "ana john"

8. 合并数组——优化合并大型数组耗内存的问题

合并两个数组 array.concat( array2 )
然后这个函数并不适合用来合并两个大型的数组,因为其将消耗大量的内存来存储新创建的数组

  1. //(1)
  2. var array1 = [ 1, 2, 3 ];
  3. var array2 = [ 4, 5, 6 ];
  4. console.log( array1.concat( array2 ) ); // [1,2,3,4,5,6];
  5. //(2)——优化版
  6. var array1 = [ 1, 2, 3 ];
  7. var array2 = [ 4, 5, 6 ];
  8. console.log( array1.push.apply( array1, array2 ) ); // [1,2,3,4,5,6];

解决办法:Array.pus().apply(arr1,arr2) 来替代创建一个新数组。这种方法不是用来创建一个新的数组,其只是将第一个第二个数组合并在一起,同时减少内存的使用。

9. NodeList 转换为数组

如果你运行 document.querySelectorAll(“p”) 函数时,它可能返回DOM元素的数组,也就是NodeList对象。但这个对象不具有数组的函数功能,比如: sort()reduce()map()filter() 等。为了让这些原生的数组函数功能也能用于其上面,需要将节点列表转换成数组。可以使用 [].slice.call(elements) 来实现

  1. (1)
  2. var elements = document.querySelectorAll( "p" ); // NodeList
  3. var arrayElements = [].slice.call( elements ); // Now the NodeList is an array
  4. Array.isArray( elements ); //false
  5. Array.isArray( arrayElements ); //true
  6. (2)
  7. var elements = document.querySelectorAll( "p" ); // NodeList
  8. var arrayElements = Array.from( elements ); // Now the NodeList is an array
  9. Array.isArray( elements ); //false
  10. Array.isArray( arrayElements ); //true

10. 数组排序;

元素在数组中的排序方式

  1. var array = [2, 6, 1, 4, 5, 3, 8, 10, 7, 9];
  2. array = array.sort( function( a, b ) { return a - b } );
  3. console.log( array ); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  4. var array = [2, 6, 1, 4, 5, 3, 8, 10, 7, 9];
  5. array = array.sort( function( a, b ) { return b - a } );
  6. console.log( array ); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  7. var array = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
  8. array = array.sort( function() { return Math.random() - 0.5 } );
  9. console.log( array ); // [3, 2, 5, 1, 8, 4, 6, 9, 10, 7]

11. 短路语句 和 三目运算符

简化条件判断 if if else

  1. true && (/*执行语句*/);//短路语句
  2. var a = true;
  3. a && ( a = 1 );
  4. console.log( a ); // 1
  5. var a = true;
  6. a && ( a = 2, console.log( a ) );// 2
  7. console.log( a ); // 2
  8. Boolean ? /*true 执行*/ /*false 执行*/ //三目
  9. var a = true;
  10. a ? a = false : a = 2;
  11. console.log( a ); // false
  12. var a = true;
  13. a ? a = false : a = true;
  14. console.log( a ); // true;
  15. Boolean ? ( Boolean ? true false ) false //三目嵌套
  16. var a = 2;
  17. a >= 2 ? ( a > 2 ? a = 2 : a = 1 ) : a = 4;
  18. console.log( a ); // 1
  19. var a = 2;
  20. a >= 2 ? ( a > 2 ? a = 2 : a = 1 ) : a = 4;
  21. console.log( a ); //4

12. || 运算符

在ES6中有默认参数这一特性。为了在老版本的浏览器中模拟这一特性,可以使用||操作符,并且将将默认值当做第二个参数传入。如果第一个参数返回的值为false,那么第二个值将会认为是一个默认值。如下面这个示例

  1. function User( name, age ) {
  2. this.name = name || "Oliver Queen";
  3. this.age = age || 20;
  4. }
  5. var user1 = new User();
  6. console.log( user1.name ); // Oliver Queen
  7. console.log( user1.age ); // 20
  8. var user2 = new User( "Barry Allen", 25 );
  9. console.log( user2.name ); // Barry Allen
  10. console.log( user2.age ); // 25
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注