【你不知道的JavaScript】(02)原生函数+强制类型转化+语法

你不知道的JavaScript-----原生函数 实际上,使用常量和使用构造函数的效果是一样的(创建的值都是通过封装对象来包装)。通过构造函数(如 new String("hello world"))创建出来的是封装了基本类型值(如 "hello world")的封装对象。符号可以用作属性名,但无论是在代码还是开发控制台中都无法查看和访问它的值,只会显示为诸如 Symbol(Symbol.create) 这样的值。相较于其他原生构造函数, Date(..) 和 Error(..) 的用处要大很多,因为没有对应的常量形式来作为它们的替代。 阅读详情

本文章仅针对我自己在看书过程中对一些不太清楚的知识点进行查漏补缺——《你不知道的JavaScript(中卷)》第一部分类型和语法中的 第三章+第四章+第五章

原生函数

原生函数有哪些

String()

Number()

Boolean()

Array()

Object()

Function()

RegExp()

Date()

Error()

Symbol()

原生函数当作构造函数使用会怎么样

原生函数可以被当作构造函数来使用,但其构造出来的对象可能会和我们设想的有所出入

var a = new String( "abc" );
typeof a; // 是"object",不是"String"
a instanceof String; // true
Object.prototype.toString.call( a ); // "[object String]"

var b = new Boolean( false );
!b; // false 而不是true 因为此时b为一个对象

valueOf()函数有什么作用

如果想要得到封装对象中的基本类型值,可以使用 valueOf() 函数

var a = new String( "abc" );
var b = new Number( 42 );
var c = new Boolean( true );
a.valueOf(); // "abc"
b.valueOf(); // 42
c.valueOf(); // true

哪些原生函数尽量不要使用

Object(..)/Function(..)/RegExp(..)

在实际情况中没有必要使用 new Object() 来创建对象,因为这样就无法像常量形式那样一次设定多个属性,而必须逐一设定。

构造函数 Function 只在极少数情况下很有用,比如动态定义函数参数和函数体的时候。不要把 Function(..) 当作 eval(..) 的替代品,你基本上不会通过这种方式来定义函数。

强烈建议使用常量形式(如 /^a*b+/g )来定义正则表达式,这样不仅语法简单,执行效率也更高,因为 JavaScript 引擎在代码执行前会对它们进行预编译和缓存。与前面的构造函数不同,RegExp(..) 有时还是很有用的,比如动态定义正则表达式时:

var name = "Kyle";
var namePattern = new RegExp( "\\b(?:" + name + ")+\\b", "ig" );
var matches = someText.match( namePattern );

Symbol

Symbol不能通过构造函数即new Symbol形式创建,否则会报错

Object.getOwnPropertySymbols(..) 便可以公开获得对象中的所有符号

Symbol.iterator属性的值是一个函数,它返回一个迭代器对象;迭代器指的是拥有next方法的对象;next方法返回的是一个带有value和done的对象,而for/of循环是用于遍历可迭代对象的

var obj = {}
obj[Symbol.iterator] = function(){ /*..*/ };

特殊的原生原型

Function.prototype 是一个空函数

RegExp.prototype 是一个“空”的正则表达式(无任何匹配)

Array.prototype 是一个空数组

强制类型转化

JSON

undefined、function 、symbol (ES6+)和包含循环引用(对象之间相互引用,形成一个无限循环)的对象都不符合 JSON 结构标准,支持 JSON的语言无法处理它们

JSON.stringify(..) 在对象中遇到 undefined 、function 和symbol 时会自动将其忽略,在数组中则会返回 null

如果对象中定义了 toJSON() 方法,JSON 字符串化时会首先调用该方法,然后用它的返回值来进行序列化。但这并不意味着toJSON() 返回的是 JSON 字符串化后的值,而是返回一个能够被字符串化的安全的 JSON值

Number()

如果Number()函数里面的参数是一个对象,检查该值是否有 valueOf() 方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString() 的返回值(如果存在)来进行强制类型转换。如果 valueOf() 和 toString() 均不返回基本类型值,会产生TypeError 错误。

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

Boolean假值有哪些

undefined

null

false

+0 0 -0 NaN

"" " " "\t" "\n" "\n\t"

其他都为真哦,包括假值对象如

var a = new Boolean( false );
var b = new Number( 0 );
var c = new String( "" );
var d = Boolean( a && b && c );
d; // true

+

var timestamp = +new Date(); // 当前时间的时间戳
var p = +"3.14"; // 3.14

parseInt()

parseInt的第一个参数为字符串(会隐式转化为数字),第二个参数为进制,默认10进制

下面来看看几个奇怪的返回值

parseInt( 1/0, 19 ); // 18

解释:

1 / 0 的结果为Infinity,为数字类型,但因为parseInt的第一个参数需要为字符串,所以转化为"Infinity",进制为19,I符合19进制,n不符合,因此后面的字符都省略,即

parseInt(1 / 0, 19) => parseInt(Infinity, 19) => parseInt('Infinity', 19) => parseInt('I', 19) => 18

其他的几个例子也同理

parseInt( 0.000008 ); // 0 ("0" 来自于 "0.000008")
parseInt( 0.0000008 ); // 8 ("8" 来自于 "8e-7")
parseInt( false, 16 ); // 250 ("fa" 来自于 "false")
parseInt( parseInt, 16 ); // 15 ("f" 来自于 "function..")
parseInt( "0x10" ); // 16
parseInt( "103", 2 ); // 2

==

== 允许在相等比较中进行强制类型转换,而 === 不允许

==的两边如果是数字和字符串,则会将字符串强制转化为数字再进行比较

var a = 42;
var b = "42";
a === b; // false
a == b; // true

==的两边如果有布尔值,则会将布尔值强制转化为数字再进行比较

var a = "42";
var b = true;
a == b; // false

==的两边如果同时为undefined或null,则相等

var a = null;
var b;
a == b; // true
a == null; // true
b == null; // true
a == false; // false
b == false; // false
a == ""; // false
b == ""; // false
a == 0; // false
b == 0; // false

==的两边如果是(字符串或数字)和对象,则对象会经过抽象操作(如toString() 、valueOf())后再进行比较

var a = 42;
var b = [ 42 ];
a == b; // true

举两个例子看懂了说明你彻底理解了

false == [] // 等价
0 == [] // 等价
0 == '' // 等价
0 == 0 // 所以结果为true
[] == ![] // 等价
[] == false // 等价
"" == false // 等价
"" == 0 // 等价
0 == 0 // 所以结果为true

其他奇奇怪怪的情况

Number.prototype.valueOf = function() {
    return 3;
};
new Number( 2 ) == 3; // true
var i = 2;
Number.prototype.valueOf = function() {
    return i++;
};
var a = new Number( 42 );
if (a == 2 && a == 3) {
    console.log( "Yep, this happened." );
}

语法

语句和表达式

语句相当于英语中的句子,由一个或多个短语组成,它们之间由运算符连接起来

表达式相当于英语中的短语,

var a = 3 * 6;
var b = a;
b;

var a = 3 * 6 和 var b = a称为“声明语句”

a = 3 * 6 和 b = a叫作“赋值表达式”

第三行代码中只有一个表达式 b ,同时它也是一个语句,叫作“表达式语句”

第一行的3 * 6 是一个表达式,第二行的 a 也是一个表达式,第三行的 b 也是

运算符优先级

&& > || > a?b:c

且... ? ... : ... 是右关联的,即

a ? b : c ? d : e; // 等价
a ? b : (c ? d : e);

那么以下代码的值是多少呢?

var a = 42;
var b = "foo";
var c = false;
var d = a && b || c ? c || b ? a : c && b : a;
d; // 42

你不知道的JavaScript(八):类型和语法 这样的属性和方法,需要通过封装对象才能访问,此时 JavaScript 会自动为基本类型值包装(box 或者 wrap)一个封装对象。实际上,使用常量和使用构造函数的效果是一样的(创建的值都是通过封装对象来包装)使用相同的算法,所以除了 JavaScript 引擎实现上的细微差别之外,它们之间并没有什么不同。undefined 和 null 常被用来表示“空的”值或“不是值”的值。如果两个值的类型不同,我们就需要考虑有没有强制类型转换的必要,有就用。如果有并且返回基本类型值,就使用该值进行强制类型转换。 阅读详情

相关推荐

你不知道的JavaScript-----强制类型转换

a和b并没有被转换为数字,因为ToPrimitive返回的是字符串,所以ToPrimitive返回的是字符串,所以这里比较的是“42”和“043”两个字符串,它们分别以“4”和“0”开头。所以建议,无论什么情况下都不要使用==true和==false。请注意,这里说的只是==,===true和===false不允许强制类型转换,所以并不涉及ToNumber。= 0 和== -1这样的写法不是很好,称为“抽象渗漏”,意思是在代码中暴露了底层的实现细节,这里是指用-1作为失败时的返回值,这些细节应该被屏蔽掉。

每天都要努力学习哦~~ 1225

原生函数

什么是原生函数?就是为基本数据类型值提供了封装对象,就叫原生函数。​这些函数为基本数据类型值提供了该子类型特有的方法和类型(我认为就类似于内置对象吧,只是这个是函数形式) 常用的有这么几种: ◦ String() ◦ Number() ◦ Boolean() ◦ Array() ◦ Object() ◦ Function() ◦ RegExp() ◦ Date() ◦ Err...

hohocj的博客 525

你不知道的JS

包含:JS基础、JS实操。

weixin_57136547的博客 3060

《你不知道的JavaScript》:理解js原生函数

本篇来看下js中的原生函数,也叫内置函数。主要包括如下: String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol() 原生函数可以被当作构造函数来用,但其构造出来的对象与设想的有区别,以String()为例: var s = new String(“abc”); console.l...

weixin_44387879的博客 253

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1410

【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比

本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。

qq_32516809的博客 1804

(JavaScript - 原生)函数

(JavaScript - 原生)函数 如果说JavaScript中变量是公民的话,那么我认为函数就是皇上!这一章就来一起研究JavaScript中的函数,对于这个无论是拜将封侯的老鸟还是冲锋陷阵的菜鸟都爱不释手的皇上,特此记录下来以备查看,希望本次讲解真正做到深入浅出! 插曲: 对于我们后续的讲解,我们先来了解一个概念 - 变量提升 -> 仅仅存在于ES5及其之前的ECMA的语言规范...

萍果吮雨的博客 3777

机房电脑的“还原”秘密:如何应对重启即清零的困境

机房电脑重启后自动还原是常见的现象,这主要依靠硬件还原卡或软件还原系统(如冰点还原)实现。这类技术会定期将系统盘恢复初始状态,但通常不保护非系统盘。要高效使用公共电脑,建议:1)将个人文件存储在D/E盘;2)使用绿色便携软件;3)必要时可尝试通过热键临时关闭还原功能;4)养成云端备份习惯。掌握这些技巧既能遵守机房规定,又能保证学习资料安全,培养良好的数字资产管理能力。

一位主要以学校学生信息技术,社会工作生活讲解科普拓展的博主 1453

js的强制类型转换

js的强制类型转换 方法主要有三种 转换函数、强制类型转换、利用js变量弱类型转换。 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。一些示例如下: 复制代码代码如下: parseInt("1234blue"); //returns 1234 parseInt("0xA");...

weixin_40762926的博客 7935

华为EC6108V9E刷机实战:从U盘准备到开机优化的完整避坑指南

本文提供华为悦盒EC6108V9E刷机与优化的完整实战指南。针对搭载RK3228芯片和安卓4.4.4系统的设备,从型号确认、固件选择、U盘准备,到详细刷机步骤、常见故障排除,以及刷机后的深度性能优化,手把手帮助用户规避风险,让旧盒子焕发新生,成为流畅的全能媒体中心。

weixin_29324401的博客 1191

Cesium 入门

Viewer:主要窗口Cesium 展示三维要素内容的主要窗口,包含三维地球的视窗,还包含了一些基础控价const viewer = new Cesium.Viewer('div的ID',{ options可选参数 },包括图层)options可选参数animation: false, 隐藏动画效果timeline:false, 隐藏时间轴等等Scene:场景类,隐藏地球图层Entity:实体类。

虎康的博客 3667

你不知道的JavaScript---强制类型转换

强制类型转换(Coercion)是指将一种数据类型转换为另一种数据类型的过程。在JavaScript中,这种转换可以是显式的(通过开发者明确调用转换函数)或隐式的(由JavaScript引擎自动进行)。

技小白的博客 1133

DCDC电路断电时放电波形发生震荡和电压跳变问题,如何解决?

DCDC电路断电时放电波形发生震荡和电压跳变问题: 做的一个项目需要用单片机ADC采集电压,要让单片机感应到电压降到3.1V开始往FLASH里存数据,单片机2.4V基本上就工作不了,(根据单片机手册的,擦写的时间在40mS在左右)所以3.1V降到2.4V的时间必须要大于40mS岁以上,在单片机VCC处加了一个100nF的电容,理论仿真下来150mS左右发现存不进去,用示波器抓了一下波形,发现放电时震荡很严重,实际3.1V到2.4V时间只有10ms左右,这个肯定存不进去; 请教师傅说是应该时前级DCDC开关电

**My Coding Family** 1968

javascript中的强制类型转换和自动类型转换

JS 数据类型转换 方法主要有三种, 转换函数、强制类型转换、自动类型转换。

景天科技苑 2404

RK3588 实战级 YOLOv5 Android 全解析:NPU 量化 + 多线程 + 跟踪算法,源码一次买齐

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

FJN110的博客 157

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

《你不知道的Javascript--中卷 学习总结》(原生函数、强制类型转换)

原生函数 1、常见的原生函数有: String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol() --- ES6中新加入的 2、所有typeof返回值为"object"的对象(如数组)都包含一个内部属性[Class]。我们可以通过Object.prototype.toString(...

weixin_34038293的博客 158

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JS之 数据类型转化——自动转化与强制转化

前言 在JavaScript中,数据类型大致分为两种: 基本数据类型/标准数据类型 引用数据类型/复杂数据类型/地址数据类型 其中,基本数据类型包括: 布尔类型(true、false) 数值类型(整数、浮点数) 字符串类型 undefined(未定义) null(空) 引用数据类型包括: 数组 对象 函数 在实际应用中,往往会遇到不同数据类型的数据进行比较或者需要将数据转换为...

u013386919的博客 1441

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JavaScript数据类型的转化(自动转化、强制转化)

来自逆战班的小白 数据类型的转化 在 JavaScript 程序中 , 变量中存储的数据类型没有限制 所谓的数据类型转化,就是将当前数据类型转化为其他数据类型 JavaScript中数据类型的转化,分为自动转化和强制转化 JavaScript中数据类型的自动转化 1.其他数据类型,自动转化为布尔类型 在 执行 if 判断时 ,其他数据类型会自动转化为布尔类型 0 ''''...

chj_2020的博客 445

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《你不知道的JavaScript》(中) 笔记一类型和语法

1. 类型 1.1 内置类型 Javascript中有七种内置类型:null、undefined、number、string、boolean、object、symbol(ES6)。 1.2 typeof typeof:返回参数的类型的字符串 typeof null; // "object" typeof undefined; // &am

不再闪亮的星星的博客 258

《你不知道的JavaScript》 (中) 阅读摘要

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅

前端下午茶 265

数据类型的自动转化和强制转化

在 JavaScript 程序中 , 变量中存储的数据类型没有限制也就是在变量中可以存储任何符合JavaScript语法规范的数据类型,但是 在 JavaScript 程序的执行过程中,往往需要变量中存储的数值是某种特定的数据类型,别的数据类型不行,此时就需要进行数据类型的转化。 所谓的数据类型转化,就是将当前数据类型转化为其他数据类型JavaScript中数据类型的转化,分为自动转化和强制转化,...

weixin_43310703的博客 1627

你不知道的JS(十):强制类型转换

JavaScript强制类型转换常常被认为是一种缺陷,很多人都对它充满畏惧。实际上在很多地方有经常使用到强制类型转换,让代码更加简洁。我们需要充分了解它的规则和利弊,才能适当使用。

weixin_51670675的博客 1165

精读《你不知道的javascript》中卷

前言 《你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书《你不知道的java...

weixin_39037804的博客 243
上一篇: 【算法】JS 快速幂 BigInt 力扣6338猴子碰撞的方法数
下一篇: 【你不知道的JavaScript】(03)异步+Promise+生成器
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值