《你不知道的JavaScript中卷》-类型篇

220 阅读2分钟

类型监测

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)