JavaScript高级程序设计笔记——类型校验与转换

类型判断

typeof

可以使用typeof操作符可以返回一个值的数据类型,例如:

var str = 'a bird';
console.log(typeof str); // "string"
console.log(typeof 1); // "number"

typeof不能校验 object 的其他类型,引用类型除了 function 都不能区分。

相等符与全等符

===为全等符(恒等符),当等号两边的值和类型都相同时返回 true,否则返回 false。

==为相等符(等值符),当等号两边为相同类型时就比较两边的值,两边类型不同时会发生类型的自动转换,转换为相同的类型后再作比较。

以下是一些使用==的特殊场景:

1.如果一个是 null,一个是 undefined,那么相等;
2.如果一个是字符串,一个是数值,把字符串转换成数值再进行比较;
3.如果任一值是 true,把它转换成1再比较,如果任一值是 false,把它转换成0再比较;
4.如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的 toString()或者valueOf()方法。JavaScript 核心内置类,会尝试valueOf()先于toString(),例外的是 Date,Date 利用的是toString()转换。那些不是 JavaScript 语言核心中的对象则通过各自的实现中定义的方法转换为原始值;
5.任何其他组合,都不相等。

尽量少使用==进行值判断,因为问题太多,可能产生一些意料之外的 Bug。

instanceof与constructor判断

Undefined 以外的数据可以根据"所有数据都基于 Object"的特点,即利用 constructor 属性进行判断,代码如下:

var str = 'a bird';
console.log(str.constructor === String); // true

这种方式还可以用于判断变量是否为 Array、Date 等原生对象。

利用instanceof关键字也可以判断原生对象,不过任何原生对象与 Object 比较的结果都是 true,这点需要注意。示例代码如下:

console.log(([]) instanceof Array); // true
console.log(([]) instanceof Object); // true
console.log((new Date()) instanceof Date); // true

instanceof左边为一个实例对象,右边是一个构造函数,instanceof实际上是用左实例对象的__proto__与右构造函数的prototype进行比较,会一直沿着隐式原型链__proto__向上查找直到x.__proto__.__proto__......===y.prototype为止:

function A (name) {
    this.name = name;
}
function B (name) {
    this.name = name;
}

// 如果将这句代码注释掉,会发现最终的输出结果都是false
A.prototype = B.prototype;

var a = new A('ABC');
console.log(a.__proto__ === B.prototype, a instanceof B); // true true

最推荐的判断方式
Object.prototype.toString.call()是最准确最常用的判断方式,用法如下:

Object.prototype.toString.call(''); // [object String]
Object.prototype.toString.call(1); // [object Number]
Object.prototype.toString.call(true); // [object Boolean]
Object.prototype.toString.call(undefined); // [object Undefined]
Object.prototype.toString.call(null); // [object Null]
Object.prototype.toString.call(new Function()); // [object Function]
Object.prototype.toString.call(new Date()); // [object Date]
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call(new RegExp()); // [object RegExp]
Object.prototype.toString.call(new Error()); // [object Error]

类型转换

强制类型转换

1.转字符串
将其他类型值转为字符串有两种方法: String()标准强制类型转换方法和对象的toString()方法。

全局对象的`String()`方法可以将任何类型转为字符串;变量对象的`toString()`方法可以将除 undefined 和 null 外的其他类型值转为字符串,undefined 和 null 不能转换的原因是这两个值没有`toString()`方法。

特殊的,Object 类型使用toString()转为字符串不会将对象内容输出,而是输出"[object Object]"作为代替。
此外,Number 类为数字到字符串的类型转换场景定义了三个方法:
a.toFixed(): 根据小数点后的指定位数将数字转换为字符串,它从不使用指数计数法;
b.toExponential(): 使用指数计数法将数字转换为指数形式的字符串,其中小数点前只有一位,小数点后的位数则由参数指定;
c.toPrecision(): 根据指定的有效数字位数将数字转换为字符串,如果有效数字的位数少于数字整数部分的位数,则转换成指数形式。
2. 转数值
将其他类型值转为数值有两种方法: Number()标准强制类型转换方法和全局对象的parseXXX()方法。
parseXXX()包括parseInt()parseFloat()等等方法,这些方法会先将操作对象转换为字符串,然后逐个字符检测字符串是否有可转换为数值的部分,如果有可转换为数值的部分则取出该数值返回,否则返回 NaN。
Object 类型、undefined 值和 null 转为数值的结果都是 NaN。对于布尔值,parseXXX()返回的结果都是 NaN,而Number()会把 true 转为1,把 false 转为0。

console.log(parseInt('11abc', 10), typeof parseInt('11abc')); // 输出: 11 "number"
console.log(Number(true), typeof Number(true)); // 输出: 1 "number"
console.log(parseInt({}, 10), typeof Number({})); // 输出: NaN "number"
console.log(parseInt(undefined, 10), typeof Number(undefined)); // 输出: NaN "number"

3.转布尔值
转布尔值使用的是Boolean()标准类型转换方法。对于非空字符串和非零数值一律返回 true,否则返回 false;undefined 和 null 返回 false,Object 类型返回 true。

隐性类型转换

1.数值转字符串:

 console.log(typeof ('' + 123)); // 输出: "string"

加号两边只要有一个值是字符串类型,则另一个值会先转换为字符串类型再将两个字符串进行拼接。
2.字符串转数值:

console.log(+'123', typeof +'123'); // 输出: 123 "number"

转换规则同Number()
3.其他类型转布尔:

 console.log(!!'123'); // 输出: true

转换规则同Boolean()

特殊转换

Object转JSON

之前说过,Object 类型直接使用toString()方法是不能转为正确的格式的,那么要如何以字符串的形式显示 Object 的内容呢?JavaScript 提供了一套API专门用于 Object 和JSON之间的转换:

1.JSON.stringify(OBJECT[, REPLACER[, SPACE]]): 将 OBJECT 参数转换为JSON字符串,REPLACER 参数(可选)用于转换结果的函数或数组,SPACE 参数(可选)可以为文本添加缩进、空格和换行符;
2.JSON.parse(JSONSTRING[, REVIVER]): 将 JSONSTRING 参数转换为 Object 类型,如果 JSONSTRING 不符合JSON格式规范,则直接抛出错误,REVIVER 参数(可选)是一个转换结果的函数。

示例:

 var data = {
    name: 'xxx',
    id: 1
};
var json = JSON.stringify(data);
console.log(json); // '{"name":"xxx","id":1}'
console.log(JSON.parse(json)); // {name:"xxx",id:1}

String转RegExp

RegExp 即正则类型,将处理后的字符串作为匹配规则(转为正则表达式)是一个常见的操作,可以使用new RegExp(STRING[, MODIFIER]),STRING 即作为匹配规则的字符串,MODIFIER(可选)为修饰符组合(“i”、“g”、"m"任意组合)。

示例:

var regExp = new RegExp('WJT[0-9]{2}', 'gi');
console.log(regExp.test('I am xxx')); // true

注意,作为匹配规则的字符串中的通配符前要多加一个反斜杠,例如,“\w"要写为”\w"。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值