JS奇淫巧技

// http://www.tuicool.com/articles/2YNNVvv
//1) 使用!!将变量转换成布尔类型

function Account(cash) {
    this.cash = cash;
    this.hasMoney = !!cash;
}
var account = new Account(100.50);
console.log(account.cash); // 100.50
console.log(account.hasMoney); // true

var emptyAccount = new Account(0);
console.log(emptyAccount.cash); // 0
console.log(emptyAccount.hasMoney); // false


//2) 使用+将变量转换成数字
//这个转换超级简单,但它只适用于数字字符串,不然就会返回NaN( 不是数字 )

function toNumber(strNumber) {
    return +strNumber;
}
console.log(toNumber("1234")); // 1234
console.log(toNumber("ACB")); // NaN

//这个转换操作也可以作用于Date,在这种情况下,它将返回时间戳:

console.log(+new Date()) // 1461288164385

//3) 短路条件

if (conected) {
    login();
}
//在这两个变量之间使用&&(AND运算符)来缩短代码
conected && login();
//你也可以用这种方法来检查对象中是否存在某些属性或函数。类似于以下代码:
user && user.login();

//4) 使用||设置默认值
function User(name, age) {
    this.name = name || "Oliver Queen";
    this.age = age || 27;
}
var user1 = new User();
console.log(user1.name); // Oliver Queen
console.log(user1.age); // 27

var user2 = new User("Barry Allen", 25);
console.log(user2.name); // Barry Allen
console.log(user2.age); // 25


//5) 在循环中缓存array.length
//这个技巧非常简单,并且在循环处理大数组时能够避免对性能造成巨大的影响。基本上几乎每个人都是这样使用for来循环遍历一个数组的:

for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}
//如果你使用较小的数组,那还好,但是如果处理大数组,则此代码将在每个循环里重复计算数组的大小,这会产生一定的延迟。为了避免这种情况,你可以在变量中缓存array.length,以便在循环中每次都使用缓存来代替array.length:

var length = array.length;
for (var i = 0; i < length; i++) {
    console.log(array[i]);
}
//为了更简洁,可以这么写:

for (var i = 0, length = array.length; i < length; i++) {
    console.log(array[i]);
}


//6) 检测对象中的属性
//当你需要检查某些属性是否存在,避免运行未定义的函数或属性时,这个技巧非常有用。如果你打算编写跨浏览器代码,你也可能会用到这个技术。例如,我们假设你需要编写与旧版Internet Explorer 6兼容的代码,并且想要使用document.querySelector()来通过ID获取某些元素。 但是,在现代浏览器中,这个函数不存在。所以,要检查这个函数是否存在,你可以使用in运算符。看下这个例子:

if ('querySelector' in document) {
    document.querySelector("#id");
} else {
    document.getElementById("id");
}

//7) 获取数组的最后一个元素
//Array.prototype.slice(begin,end)可以用来裁剪数组。但是如果没有设置结束参数end的值的话,该函数会自动将end设置为数组长度值。我认为很少有人知道这个函数可以接受负值,如果你将begin设置一个负数的话,你就能从数组中获取到倒数的元素:

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


//8) 数组截断
//这个技术可以锁定数组的大小,这对于要删除数组中固定数量的元素是非常有用的。例如,如果你有一个包含10个元素的数组,但是你只想获得前五个元素,则可以通过设置array.length = 5来阶段数组。看下这个例子:
var array = [1, 2, 3, 4, 5, 6];
console.log(array.length); // 6
array.length = 3;
console.log(array.length); // 3
console.log(array); // [1,2,3]

//9) 全部替换
//String.replace()函数允许使用String和Regex来替换字符串,这个函数本身只能替换第一个匹配的串。但是你可以在正则表达式末尾添加/g来模拟replaceAll()函数:

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


//10) 合并数组
//如果你需要合并两个数组,你可以使用Array.concat()函数:

var array1 = [1, 2, 3];
var array2 = [4, 5, 6];
console.log(array1.concat(array2)); // [1,2,3,4,5,6];
//但是,这个函数对于大数组来说不并合适,因为它将会创建一个新的数组并消耗大量的内存。在这种情况下,你可以使用Array.push.apply(arr1,arr2),它不会创建一个新数组,而是将第二个数组合并到第一个数组中,以减少内存使用:

var array1 = [1, 2, 3];
var array2 = [4, 5, 6];
console.log(array1.push.apply(array1, array2)); // [1,2,3,4,5,6];

//11) 把NodeList转换成数组
//如果运行document.querySelectorAll("p")函数,它会返回一个DOM元素数组,即NodeList对象。但是这个对象并没有一些属于数组的函数,例如:sort(),reduce(),map(),filter()。为了启用这些函数,以及数组的其他的原生函数,你需要将NodeList转换为数组。要进行转换,只需使用这个函数:[] .slice.call(elements):

var elements = document.querySelectorAll("p"); // NodeList
var arrayElements = [].slice.call(elements); // 现在已经转换成数组了
var arrayElements = Array.from(elements); // 把NodeList转换成数组的另外一个方法

//12) 对数组元素进行洗牌
//如果要像外部库Lodash那样对数据元素重新洗牌,只需使用这个技巧:

var list = [1, 2, 3];
console.log(list.sort(function () {
    return Math.random() - 0.5
})); // [2,1,3]

//http://www.tuicool.com/articles/J77nIba
//1、如果 ajax 返回单一的 json 格式,接收方需要这样再格式化一下赋值:
var str = eval("(" + msg + ")");
//删除前后空格 String.prototype.trim = function () { return this.replace(/(^[ | ] )|([ | ] $)/g,""); }
document.getElementsByTagName('*').length //查看页面有多少个 Dom 元素;


//按照 json 的属性值排序
var cc = [
    {name: "a", age: 30},
    {name: "c", age: 24},
    {name: "b", age: 28},
    {name: "e", age: 18},
    {name: "d", age: 38}
].sort(function (obj1, obj2) {
    return obj1.age - obj2.age;
});
for (var i = 0; i < cc.length; i++) {
    alert(cc[i]['age']); //依次显示 18,24,28,30,38
}

//合并数组:

var mergeTo = [4, 5, 6];
var mergeFrom = [7, 8, 9];
Array.prototype.push.apply(mergeTo, mergeFrom);
mergeTo; // is: [4, 5, 6, 7, 8, 9]

//多点击事件获取点击的是哪个
$('#IndexLink,#IndexLink1').on('click', function (e) {
    var id = e.target.id;
//id 取到的就是被点击的ID值
}


// 锚点定位方法
window.location.hash = 'm001';
 < / a >

//简写对象属性

//在 JavaScript 中定义对象很简单,而且 ES6 提供了一个更简单的分配对象属性的方法。如果属性名与 key 值相同,例如:

const obj = {x: x, y: y};
//则可以简写为
const obj = {x, y};
//http://www.tuicool.com/articles/aqiMbaf  黑科技

//不用Number、parseInt和parseFloat和方法把"1"字符串转换成数字

//哈哈,不准用强制类型转换,那么就想到了强大了隐式转换

var a =1
    +a

//论如何优雅的取整
// 都是返回2
var a = ~~2.33

var b= 2.33 | 0

var c= 2.33 >> 0

//如何优雅的实现金钱格式化:1234567890 --> 1,234,567,890

//用正则魔法实现:

var test1 = '1234567890'
var format = test1.replace(/\B(?=(\d{3})+(?!\d))/g, ',')

console.log(format) // 1,234,567,890
//非正则的优雅实现:

function formatCash(str) {
    return str.split('').reverse().reduce((prev, next, index) => {
        return ((index % 3) ? next : (next + ',')) + prev
})
}
console.log(formatCash('1234567890')) // 1,234,567,890


//实现标准JSON的深拷贝

var a = {
    a: 1,
    b: { c: 1, d: 2 }
}
var b=JSON.parse(JSON.stringify(a))

//最短的代码实现数组去重
[...new Set([1, "1", 2, 1, 1, 3])]


//取出一个数组中的最大值和最小值

var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
var maxInNumbers = Math.max.apply(Math, numbers);
var minInNumbers = Math.min.apply(Math, numbers);


//javascript高逼格之Function构造函数
//
//很多JavaScript教程都告诉我们,不要直接用内置对象的构造函数来创建基本变量,例如var arr = new Array(2); 的写法就应该用var arr = [1, 2];的写法来取代。

//但是,Function构造函数(注意是大写的Function)有点特别。Function构造函数接受的参数中,第一个是要传入的参数名,第二个是函数内的代码(用字符串来表示)。

var f = new Function('a', 'alert(a)');
f('jawil'); // 将会弹出窗口显示jawil





你可能感兴趣的:(JavaScript)