类型监测
typeof undefined === "undefined"; // true
typeof true === "boolean"; // true
typeof 42 === "number"; // true
typeof "42" === "string"; // true
typeof { life: 42 } === "object"; // true
// ES6中新加入的类型
typeof Symbol() === "symbol"; // true
typeof function a(){ /* .. */ } === "function"; // true
特殊的:null空值
typeof无法正确检测null
typeof null==="object";//true
- 正确方法;
var a=null;
console.log((!a && typeof a === "object"))//true
类数组/伪数组变为数组
方式1:工具函数slice
function foo() {
var arr = Array.prototype.slice.call( arguments );
arr.push( "bam" );
console.log( arr );
}
foo( "bar", "baz" ); // ["bar","baz","bam"]
方式2:Array.from
Array.from() 方法从一个类似数组或可迭代对象中创建一个新的数组实例
function f() {
return Array.from(arguments);
}
f(1, 2, 3);
// [1, 2, 3]
数组去重Array.from
function combine(){
let arr = [].concat.apply([], arguments); //没有去重复的新数组
return Array.from(new Set(arr));
}
var m = [1, 2, 2], n = [2,3,3];
console.log(combine(m,n)); // [1, 2, 3]
整数监测
检测整数
- es6 ES6 中的 Number.isInteger() 方法
Number.isInteger( 42 ); // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 ); // false
- es6之前polyfill(补充)
if (!Number.isInteger) {
Number.isInteger = function(num) {
return typeof num == "number" && num % 1 == 0
}
}
检测安全的整数
- es6 Number.isSafeInteger(..) 方法
if (!Number.isInteger) {
Number.isInteger = function(num) {
return typeof num == "number" && num % 1 == 0
}
}
- es6 polyfill
if (!Number.isSafeInteger) {
Number.isSafeInteger = function(num) {
return Number.isInteger(num) && Math.abs(num) <= Number.MAX_SAFE_INTEGER
}
}
NaN不是数字的数字
判断一个数字是不是NaN
-
es6 Number.isNaN(..)函数
-
es6之前补充
if (!Number.isNaN) {
Number.isNaN = function(n) {
return typeof n === "number" && window.isNaN(n)
}
}
var a = 2 / "foo"
var b = "foo"
Number.isNaN(a) // true
Number.isNaN(b) // false——好!
负数零-0
判断参数是否是负数0
function isNegZero(n) {
n = Number(n)
return n === 0 && 1 / n === -Infinity
}
isNegZero(-0) // true
isNegZero(0 / -3) // true
isNegZero(0) // false
判断值绝对相等
-
使用场景 判断NaN,0和-0,
-
es6 Object.is(..) 来判断两个值是否绝对相等(===) 效率比==和===低,只建议特殊值使用
-
es6之前
if (!Object.is) {
Object.is = function(v1, v2) {
// 判断是否是-0
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2
}
// 判断是否是NaN
if (v1 !== v1) {
return v2 !== v2
}
// 其他情况
return v1 === v2
}
}
正则构造函数RegExp()
一般的:使用常量形式(如/^a*b+/g)来定义正则表达式,这样不仅语法简单,执行效率
也更高,因为 JavaScript 引擎在代码执行前会对它们进行预编译和缓存。
特殊的: 定义个动态正则表达式时,使用new RegExp()
var name = "Kyle"
var namePattern = new RegExp("\\b(?:" + name + ")+\\b", "ig")
var matches = someText.match(namePattern)