이 글에서는 언박싱(unboxing) 및 유형 변환과 관련된 문제를 주로 소개하는javascript에 대한 관련 지식을 제공합니다. 복싱이란 기본 데이터 유형을 해당 참조 유형으로 변환하는 작업을 의미하므로 함께 살펴보시기 바랍니다. 모두에게 도움이 되십시오.
관련 권장 사항:javascript 튜토리얼
기본 데이터 유형:string
,number
,boolean
string
、number
、boolean
引用类型:object
、function
不存在的类型:undefined
String
、Number
、Boolean
分别属于string
、number
、boolean
三个原始类型的包装类型,它们的对象属于引用类型。
装箱是指把基本数据类型转换为对应的引用类型的操作,该过程主要是指string
、number
、boolean
类型的数据,通过String
、Number
、Boolean
进行包装成为引用类型数据的过程。
// 隐式装箱var s1 = 'Hello World'; var s2 = s1.substring(2);
上面第二行代码的执行步骤其实是这样的:
new String('Hello World')
创建一个临时的实例对象;substring
方法;s2
;销毁临时的实例对象。上面的步骤转换为代码,如下:
// 显式装箱var s1 = 'Hello World'; var tempObj = new String('Hello World'); var s2 = tempObj.substring(2);
拆箱是把引用类型转换为基本的数据类型。
关于拆箱过程中的ToPrimitive
运算符对于两端的变量,都有一个期待类型,在javascript
中,凡是不满足运算符期待类型的变量,都会做做隐式转换。
在进行逻辑运算时,隐式转换只有一个标准:只有null
、undefined
、''
、NaN
、0
和false
表示false
,其他的情况都是true
,比如{}
,[]
。
如果算术运算符两端均为number
类型的数据,直接进行计算;
如果算术运算符两端存在非number
的基本数据类型,则对非number
的运算数使用Number()
进行装箱,然后对返回值进行拆箱为number
类型,参与计算;
算术运算符两端存在引用数据类型,则先对引用类型进行拆箱操作,如果结果为非number
类型,则根据条件2
执行,否则执行条件1
。
1 - true // 0, 首先 Number(true) 转换为数字 1, 然后执行 1 - 11 - null // 1, 首先把 Number(null) 转换为数字 0, 然后执行 1 - 01 * undefined // NaN, Number(undefined) 转换为数字是 NaN , 然后执行 1 * NaN2 * ['5'] // 10, ['5'] 依照ToPrimitive规则进行拆箱会变成 '5', 然后通过 Number('5') 进行拆装箱再变成数字 5123 + {valueOf:()=>{return 10}} // 133 {valueOf:()=>{return 10}} 依照ToPrimitive规则会先调用valueOf,获得结果为10
当+
作为单目运算符出现在变量的前面时,表示的意思是将变量转换为Number
类型
+"10" // 10 同 Number("10")+['5'] // 5 ['5']依照ToPrimitive规则会变成 '5', 然后通过`Number`的拆箱操作再变成数字 5
字符串连接符的符号同算术运算符的+
。
string
类型的数据,直接进行连接string
的基本类型,则对非string
的基本类型数据使用String()
进行装箱,然后对返回值进行拆箱为基本类型,参与字符串拼接。+
两端两端存在引用数据类型,则先对引用类型进行拆箱操作,如果结果为非string
类型,则根据条件2
执行,否则执行条件1
。NaN
和其他任何类型,做任何关系运算永远返回false
(包括和他自己)。如果想判断一个变量是不是NaN
, 可以通过Number.isNaN()
来判断。
null == undefined
比较结果是true
,除此之外,null
、undefined
和其他的(不包括它们自身)任何结果的比较值都为false
。
这里是规则定义的,
참조 유형:null
为 object 的类型,可是调用valueOf
或者toString
객체
,함수
정의되지 않음
문자열
,숫자
,Boolean
은 각각 세 가지 기본 유형인string
,number
및boolean
의 패키징 유형에 속합니다. code>. 개체가 참조 유형입니다.Boxing
Boxing은 기본 데이터 유형을 해당 참조 유형으로 변환하는 작업을 의미합니다. 이 프로세스는 주로string
,number
, boolean 유형 데이터는String
,Number
,Boolean
을 통해 참조 유형 데이터로 패키징됩니다.위 두 번째 줄코드의 실행 단계는 실제로 다음과 같습니다.{} == !{} // false Number({}.valueOf().toString())==> NaN , 所以题目等同于 NaN == false , NaN 和 任何类型比较都是 false[] == [] // false 内存地址不同![] == 0 // true ![]==>false , 所以题目等同于 false==0 , Number(false)==>0 , 所以结果为 true로그인 후 복사로그인 후 복사임시 인스턴스를 생성하려면
위 단계를 다음과 같이 코드로 변환합니다.new String('Hello World')
를 사용하세요. object ;임시 개체를 사용하여substring
메서드를 호출합니다. 실행 결과를s2
에 할당합니다.- 第一步,![] 会变成 false - 第二步,[]的valueOf是[],[]是引用类型,继续调用toString,题目变成: "" == false - 第三步,符号两端转换为Number, 得到 0==0 - 所以, 答案是 true로그인 후 복사로그인 후 복사Unboxing
Unboxing은 참조 유형을 기본 데이터 유형으로 변환하는 것입니다. 언박싱 과정 중 ToPrimitive 정보유형 변환
연산자는 양쪽 끝에 있는 변수에 대해 예상되는 유형을 가지고 있습니다.javascript
에서는 연산자의 기대를 충족하지 못하는 모든 것이 있습니다. 유형 변수는 암시적으로 변환됩니다.논리 연산자
논리 연산을 수행할 때 암시적 변환에 대한 표준은null
,정의되지 않음
,단 하나입니다. ''
,NaN
,0
및false
는false
를 나타내며, 그렇지 않으면true입니다.
(예:{}
,[]
).산술 연산자
산술 연산자의 양쪽 끝이
숫자
유형의 데이터인 경우 계산이 직접 수행됩니다. 산술 연산자의 양쪽 끝에숫자
가 아닌 기본 데이터 유형이 있는 경우Number()
를 사용하여숫자
가 아닌 피연산자를 상자에 넣습니다. 그런 다음 반환 값은number
유형으로 unboxing되어 계산에 참여합니다. 산술 연산자의 양쪽 끝에 참조 데이터 유형이 있는 경우 참조 유형이 먼저 unboxing됩니다. 결과가숫자
유형이 아닌 경우조건 2
에 따라 실행되고, 그렇지 않으면조건 1
이 실행됩니다.단항 연산자로 변수 앞에- 第一步,[undefined]的valueOf结果为 [undefined],然后[undefined]通过toString变成 '' ,所以题目变成 '' == false - 第二步,符号两端转换为Number, 得到 0==0 - 所以, 答案是 true !로그인 후 복사로그인 후 복사+
가 나타나면 변수를숫자
유형var a = { value: 0, valueOf: function() { this.value += 1; return this.value }};console.log(a == 1 && a == 2 && a == 3) // true로그인 후 복사로그인 후 복사String으로 변환한다는 의미입니다. 연결 연산자
문자열 연결 연산자의 기호는 산술 연산자+
와 동일합니다.산술 연산자의 양쪽 끝이
string
유형의 데이터인 경우 직접 연결합니다. 연산자 양쪽 끝에string
이외의 기본 유형이 있는 경우 , 그런 다음String()
을 사용하여문자열
이 아닌 기본 유형 데이터를 상자에 넣은 다음 반환 값을 기본 유형으로 상자 해제하여 문자열 접합에 참여합니다.+
양쪽 끝에 참조 데이터 유형이 있는 경우 참조 유형이 먼저 unboxing됩니다. 결과가string
유형이 아닌 경우 참조 유형이 표시됩니다.조건 2
가 실행되면 상자가 풀립니다. 그렇지 않으면조건 1
이 실행됩니다.관계 연산자
NaN
및 기타 유형, 모든 관계 연산은 항상false
를 반환합니다(및 자신 포함). ). 변수가NaN
인지 확인하려면Number.isNaN()
을 사용하여 확인할 수 있습니다.null == undefine
비교 결과는true
이고, 추가로null
,undefine
및 Any입니다. 다른 결과(자신 제외)의 비교 값은false
입니다.이는 규칙에 의해 정의됩니다.null
은 개체 유형입니다. 그러나valueOf
또는toString을 호출하면 구문 오류가 발생합니다. code>.여기가 바로 결과입니다. 일반 상황:
- 如果算术运算符两端均为
number
类型的数据,直接进行计算;- 如果算术运算符两端存在非
number
的基本数据类型,则对非number
的运算数使用Number()
进行装箱,然后对返回值进行拆箱为number
类型,参与计算;- 算术运算符两端存在引用数据类型,则先对引用类型进行拆箱操作,如果结果为非
number
类型,则根据条件2
执行,否则执行条件1
。
{} == !{} // false Number({}.valueOf().toString())==> NaN , 所以题目等同于 NaN == false , NaN 和 任何类型比较都是 false[] == [] // false 内存地址不同![] == 0 // true ![]==>false , 所以题目等同于 false==0 , Number(false)==>0 , 所以结果为 true
[] == ![]
- 第一步,![] 会变成 false - 第二步,[]的valueOf是[],[]是引用类型,继续调用toString,题目变成: "" == false - 第三步,符号两端转换为Number, 得到 0==0 - 所以, 答案是 true
[undefined] == false
- 第一步,[undefined]的valueOf结果为 [undefined],然后[undefined]通过toString变成 '' ,所以题目变成 '' == false - 第二步,符号两端转换为Number, 得到 0==0 - 所以, 答案是 true !
如何使a==1 && a==2 && a==3
的结果为true
var a = { value: 0, valueOf: function() { this.value += 1; return this.value }};console.log(a == 1 && a == 2 && a == 3) // true
如何使a===1&&a===2&&a===3
的结果为true
// 使用 defineProperty 进行数据劫持var value = 0;Object.defineProperty(window,"a",{ get(){ return ++value; }})console.log(a===1&&a===2&&a===3) //true
实现一个无限累加函数
柯里化实现多参累加
相关推荐:javascript学习教程
위 내용은 JavaScript 기술: 언박싱, 박싱 및 유형 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!