《你不知道的JS》类型转换

本文深入探讨了JSON字符串化过程中的对象处理,包括toJSON()方法的使用、replacer和space参数的作用,以及如何通过这些机制控制序列化输出。同时,文章详细讲解了toNumber、ToBoolean操作的规则,展示了不同数据类型在转换为数字和布尔值时的行为,并对比了宽松相等和严格相等的区别。

第四章 强制类型转换

  • 如果对象中定义toJSON()方法,JSON字符串化会首先调用该方法,然后用它的返回值来进行序列化
var a={
    val:[1,2,3],    
    toJSON:function(){
        return this.val.slice(1);
    }
}
JSON.stringify(a);// "[2,3]"

可选参数 replacer、space

如果是数组,则必须是一个字符串数组,其中包含序列化操作要处理的对象的属性名称,除此之外其他的属性会被忽略

如果是函数,首先会对该对象本身调用一次,然后对对象中的每个属性各调用一次。每次传入两个参数,分别是key和value

var a = { b: 42, c: '42', d: [1, 2, 3] 
};

JSON.stringify(a, ['b', 'c']); // "{"b": 42, "c": "42"}"

JSON.stringify(a, function(k, v) { if( k != 'c') { return v; } }); // "{"b": 42, "d": [1, 2, 3]}"

toNumber操作

true => 1;  
false => 0;  
undefined => NaN;  
null => 0;  
  • ToNumber对字符串的处理遵循数字常量的基本法则,处理失败时会返回NaN。
  • ToNumber对于以0开头的十六进制数字并不按照十六进制进行处理,而是按照十进制
  • 对象/数组会首先被转化为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则强制转换为数字。
对于如何转成相应的基本类型,我们有如下规则,如果有valueOf()toString()方法,则将方法返回值强制类型转换


var a = {  
    valueOf: function() {
        return "42";
    }
};

var b = {  
    toString: function() {
        return "42";
    }
};

var c = [4, 2];  
c.toString = function() {  
    return this.join(""); // "42"
};

Number(a); // 42  
Number(b); // 42  
Number(c); //42  
Number(""); // 0  
Number([]); // 0  
Number(["abc"]); // NaN  

ToBoolean操作

  • 假值列表
    假值的布尔强制类型转化结果为false
undefined

null

false

+0, -0, NaN

"" //空字符串
  • 真值列表:假值列表之外的值

  • 假值对象:封装了假值的对象,但是真值

  • ~操作符

var a = "hello world";

~a.indexOf("lo") 只有为-1时 是假值 是一种很奇特的用法

if(~a.indexof("lo"))

显示解析数字字符串

ar a = "42";  
var b = "42px";

Number(a); // 42  
parseInt(a); // 42

Number(b); // NaN  
parseInt(b); // 42  

解析允许字符串含有非数字字符,从左到右遇到非数字字符就停止

转换不允许出现非数字字符,否则会失败并返回NaN


parseInt(…)针对的是字符串值,非字符串值会先被强制类型转换为字符串在进行解析,这个会导致诡异的问题 parseInt(1/0,19) 为18

显示转换为布尔值

  • 使用Boolean()和!!来进行显示强制转换为布尔值

&& 和 ||操作符

  • || 和 &&:逻辑运算符【返回两者中中的一个且仅一个值】
  • ||: 条件判断为true则返回第一个操作数,反之返回第二个
  • &&与||相反,条件判断为false则返回第二个操作数,反之返回第一个。

宽松相等和严格相等

  • 宽松相等== 允许在相等比较中进行强制类型转换,而 严格相等=== 不允许
  • 无论如何 都不建议 使用 == true 和 == false
  • 建议使用以下格式
if(a)

if(!!a)

if(Boolean(a))


null == undefined!!

抽象关系比较

  • x <= y =>被处理为 y > x然后将结果反转
  • 如果比较符号两边经过toPrimitive出现数字,则强制按照数字大小比较
  • 如果两边都是字符的话,那么就按照字符顺序比较
一、数据采集层:多源人脸数据获取 该层负责从同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值