@bluexiaowei
2016-05-26T05:41:52.000000Z
字数 4426
阅读 679
javascript小技巧
原文出处: @Caio Ribeiro Pereira
译文出处:w3cplus-大漠
降级理解:bluexiaowei
!!
!!value等于"Boolean( value )"只要变量不等于0-0""nullundefinedNaNfalse返回的都是true;
var value = 0;console.log( !!value ); // falsevar value = -0;console.log( !!value ); // falsevar value = "";console.log( !!value ); // falsevar value = null;console.log( !!value ); // falsevar value = undefined;console.log( !!value ); // falsevar value = NaN;console.log( !!value ); // falsevar value = false;console.log( !!value ); // falsevar value = 1;console.log( !!value ); // true
+将
+value等同于Number( value ),只有数字类型的字符串能正常转换其余的都是NaN
var value = "123";console.log( +value ); //123var value = "123.234";console.log( +value ); //123.234var value = "123.5g";console.log( +value ); //NaN
循环数组,每次迭代都将会重新计算数组的
array.length。所以var length = array.length保存数组长度,不进行重复计算数组长度。
var length = array.lengthfor ( var i = 0; i < length; i++ ) {console.log(array[i]);}
(1): 当
key in Array时key是索引值;
(2): 当key in Object时key是对象属性;
var array = [ 1, 2, 3, 4, 5 ];console.log( "b" in array ); // falseconsole.log( 2 in array ); // trueconsole.log( "2" in array ); // truevar object = { b: "is me", c: "is he", d: "is she" };console.log( "b" in object ); // truevar array = [ 1, 2, 3, 4, 5 ];for ( var key in array ) {console.log( key + ":" + array[key] );}// 0: 1;// 1: 2;// 2: 3;// 3: 4;// 4: 5;var object = { b: "is me", c: "is he", d: "is she" };for ( var key in array ) {console.log( key + ":" + object[key] );}// b: "is me";// c: "is he";// d: "is she";
slice()
array.slice( [start], [end] )从已有的数组中截取选定的元素。“截头不截尾”。
start为负数则从尾部开始截取。end不支持负数。
var arr, array = [ 1, 2, 3, 4, 5, 6 ];arr = array.slice();console.log( arr ); //[ 1, 2, 3, 4, 5, 6 ]arr = array.slice( 2, 5 );console.log( arr ); //[ 3, 4, 5 ]arr = array.slice( -2, 5 );console.log( arr ); //[ 5 ]arr = array.slice( -2, -1 );console.log( arr ); //[ ]arr = array.slice( -3 );console.log( arr ); //[ 4, 5, 6 ]
array.length = value
var array = [1, 2, 3, 4, 5, 6];console.log( array.length ); //5array.length = 3;console.log( array ); //[1, 2, 3, 4];
string.replce()
string.replace(searchvalue,newvalue)在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
匹配字符串中相同的:serchvalue: RegExp/string将相同的替换为newvalue: value
var string = "john john";console.log( string.replace( /hn/, "ana" ) ); // "joana john"console.log( string.replace( /hn/g, "ana" ) ); // "joana joana"console.log( string.replace( "john", "ana" ) ); // "ana john"
合并两个数组
array.concat( array2 )。
然后这个函数并不适合用来合并两个大型的数组,因为其将消耗大量的内存来存储新创建的数组
//(1)var array1 = [ 1, 2, 3 ];var array2 = [ 4, 5, 6 ];console.log( array1.concat( array2 ) ); // [1,2,3,4,5,6];//(2)——优化版var array1 = [ 1, 2, 3 ];var array2 = [ 4, 5, 6 ];console.log( array1.push.apply( array1, array2 ) ); // [1,2,3,4,5,6];
解决办法:
Array.pus().apply(arr1,arr2)来替代创建一个新数组。这种方法不是用来创建一个新的数组,其只是将第一个第二个数组合并在一起,同时减少内存的使用。
如果你运行
document.querySelectorAll(“p”)函数时,它可能返回DOM元素的数组,也就是NodeList对象。但这个对象不具有数组的函数功能,比如:sort()、reduce()、map()、filter()等。为了让这些原生的数组函数功能也能用于其上面,需要将节点列表转换成数组。可以使用[].slice.call(elements)来实现
(1)var elements = document.querySelectorAll( "p" ); // NodeListvar arrayElements = [].slice.call( elements ); // Now the NodeList is an arrayArray.isArray( elements ); //falseArray.isArray( arrayElements ); //true(2)var elements = document.querySelectorAll( "p" ); // NodeListvar arrayElements = Array.from( elements ); // Now the NodeList is an arrayArray.isArray( elements ); //falseArray.isArray( arrayElements ); //true
元素在数组中的排序方式
var array = [2, 6, 1, 4, 5, 3, 8, 10, 7, 9];array = array.sort( function( a, b ) { return a - b } );console.log( array ); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]var array = [2, 6, 1, 4, 5, 3, 8, 10, 7, 9];array = array.sort( function( a, b ) { return b - a } );console.log( array ); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]var array = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];array = array.sort( function() { return Math.random() - 0.5 } );console.log( array ); // [3, 2, 5, 1, 8, 4, 6, 9, 10, 7]
简化条件判断
ifif else
true && (/*执行语句*/);//短路语句var a = true;a && ( a = 1 );console.log( a ); // 1var a = true;a && ( a = 2, console.log( a ) );// 2console.log( a ); // 2Boolean ? /*true 执行*/ : /*false 执行*/; //三目var a = true;a ? a = false : a = 2;console.log( a ); // falsevar a = true;a ? a = false : a = true;console.log( a ); // true;Boolean ? ( Boolean ? true : false ) : false; //三目嵌套var a = 2;a >= 2 ? ( a > 2 ? a = 2 : a = 1 ) : a = 4;console.log( a ); // 1var a = 2;a >= 2 ? ( a > 2 ? a = 2 : a = 1 ) : a = 4;console.log( a ); //4
|| 运算符在ES6中有默认参数这一特性。为了在老版本的浏览器中模拟这一特性,可以使用||操作符,并且将将默认值当做第二个参数传入。如果第一个参数返回的值为false,那么第二个值将会认为是一个默认值。如下面这个示例
function User( name, age ) {this.name = name || "Oliver Queen";this.age = age || 20;}var user1 = new User();console.log( user1.name ); // Oliver Queenconsole.log( user1.age ); // 20var user2 = new User( "Barry Allen", 25 );console.log( user2.name ); // Barry Allenconsole.log( user2.age ); // 25