《JavaScript语言精粹》读书笔记(二)类型判断及方法

Published: 2015-12-28

Tags: Javascript

本文总阅读量
  1. Number 类型
  2. String 类型
  3. Arrary 类型
  4. Undefined 类型
  5. function 类型
  6. Object 类型

如果是其它语言,如python,判断类型不会很麻烦,但是对于js来说,各种null,undefined,NaN进来搀合一脚,有的时候判断就不准确了

1. Number 类型

(1)判断是否为数字类型

当单单使用typeof的时候,NaN也会被识别为number

function isNumber(obj) {
    return typeof obj === 'number';
}

console.log(isNumber(NaN));  // true
console.log(isNumber(''));  // false
console.log(isNumber(null));  // false
console.log(isNumber(36));  // true
console.log(isNumber(36.11)); // true

所以需要添加个!isNaN来过滤掉NaN

function isNumber(obj) {
    return typeof obj === 'number' && !isNaN(obj);
}

console.log(isNumber(NaN));  // false
console.log(isNumber(''));  // false
console.log(isNumber(null));  // false
console.log(isNumber(36));  // true
console.log(isNumber(36.11)); // true

(2)判断是否为整数

ES6提供了Number.isInteger()方法来判断是否为整数,在Chrome中测试没有问题,很好用

但是在node里还没有得到支持,想来V8更新的也不及时,那么用另外一种方法还是有些必要的

var isInteger = function(obj) {
    return typeof obj === 'number' && !isNaN(obj) && obj%1 === 0;
}

console.log(isNumber(36));  // true
console.log(isNumber(36.11)); // false

(3)判断是否为浮点数

上边的判断整数的将最后的全等符号改为!==就可以了

(4)判断正负

将如上表达式后再追加obj>0obj<0即可

关于Number类型的数据,主要方法有

  • toFixed() - 转换为10进制的字符串
  • toPrecision() - 转换为10进制的字符串
  • toString() - 转化为指定进制的字符串

toFixed与toPrecision类似,注意观察接收的参数与结果

toString()方法很多时候可以简写为String()

console.log(Math.PI.toFixed(3)); // "3.142"
console.log(Math.PI.toPrecision(3));  // "3.14"
console.log(Math.PI.toPrecision(6));  // "3.14159"
console.log(Math.PI.toString(2));  // "11.001001000011111101101010100010001000010110100011"
console.log(Math.PI.toString(8));  // "3.1103755242102643"
console.log(Math.PI.toString(10));  // "3.141592653589793"
console.log(String(Math.PI)); // "3.141592653589793"

2. String 类型

String 类型使用typeof就可以判断出来,这里主要整理一下关于String 类型的内置方法。

  • charAt(pos) - 取得字符串在某处的字符
  • replace(searchValue, replaceValue) - 替换字符串中的指定字符
  • indexOf(searchString, position) - 获取指定字符串在字符串中的位置
  • slice(start, end) - 复制字符串的一部分构造一个新的字符串
  • splice(separator, limit) - 根据指定字符分割字符串
  • toLowerCase() - 转化为小写
  • toUpperCase() - 转化为大写
var name = 'something';
console.log(name.charAt(1));  // o

var str = 'a-b-c-d-e-f-g';
console.log(str.replace('-', '_'));  // a_b-c-d-e-f-g
console.log(str.replace(/(-)/, '_')); // a_b-c-d-e-f-g
console.log(str.replace(/(-)/g, '_')); // a_b_c_d_e_f_g

这个replace应该值的注意,之前用python都是全部替换的,直到今天我才知道replace是默认只替换第一个匹配到的...也许之前莫名其妙的错误找到原因了...(▼へ▼メ)

var str = 'abcabc';
console.log(str.indexOf('b'));  // 1
console.log(str.indexOf('f'));  // -1
console.log(str.indexOf('c', 3)); // 5

console.log(str.slice(1, 3)); // 'bc' 

这个slice还有一些超出边界的处理规则,不过还是这一种常用,就不引申太多了

var str = '2015-12-28';
console.log(str.split('-')); // [ '2015', '12', '28' ]
console.log(str.split('-', 2)); // [ '2015', '12' ]

var str = '2015-12-28 15:29:11';
console.log(str.split(/[\-: ]/)); // [ '2015', '12', '28', '15', '29', '11' ]

正则表达式真是个不错的东西呢,刚接触js的时候我分割多个不同参数都是使用“级联”的,如str.replace(':').replace('-').replace(' ')

var str = 'abcDEF';
console.log(str.toLowerCase()); // abcdef
console.log(str.toUpperCase()); // ABCDEF

4. Arrary 类型

aaa

在使用数组之前,需要先确定这是一个数组,除非你对给定的数据类型很清除。然而遗憾的是Typeof会把数组类型判断为Object类型,可以使用书中提供的一个方法来判断

var is_array = function (value) { 
  return Object.prototype.toString.apply(value) === '[object Array]';
};

console.log(is_array({'hello': 'world'}));  // false
console.log(is_array([1, 2, 3, 4, 5, 6]));  // true
  • Array.length - 返回数组的长度
  • Array.splice(index, number) - 从数组中删除元素

length就是我们理解的length,但是需要注意有时它不等于数组里元素的个数

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

myArray[1000] = true;
console.log(myArray.length);  // 1001

使用delete删除数组元素会导致数组产生空洞,使用splice则会完成想要的效果,可能splice在处理大数组的时候会很慢

var testArray  = ["a","b","c"];
console.log(testArray);
console.log("size:" + testArray.length);
testArray.splice(0,1);
console.log(testArray);
console.log("size:" + testArray.length);

数组的添加元素,倒转,弹出元素

var arr = [1, 2, 3];
arr.pop(); // [ 1, 2 ]
arr.push(3); // [ 1, 2, 3 ]
arr.shift(); // [ 2, 3 ]
arr.reverse(); // [ 3, 2 ]
arr.unshift(5, 6);  // [ 5, 6, 3, 2 ]

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

数组的排序

var n = [22, 3, 12, 8, 77, 103, 31];
n.sort(function(a, b) {
  return a - b;
});
console.log(n); // [ 3, 8, 12, 22, 31, 77, 103 ]

数组转字符串

var arr = [1, 2, 3];
var str = arr.join(',');
console.log(str);  // '1,2,3'
var str2 = arr.join('');
console.log(str2);  // '123'

数组的方法挺多的 (。・`ω´・)