博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
看不懂的隐式转换(上)--- 基础铺垫
阅读量:7244 次
发布时间:2019-06-29

本文共 3578 字,大约阅读时间需要 11 分钟。

前言

看不懂系列 [滑稽.jpg] 最近在找工作,后面的博客内容也算自己的准备了,嘿嘿 其实自己平常看书的时候,也会发现很多东西讲的太官话,有点看不懂 有些资料呢,可能又将的太碎片化了, 所以我经常把书上知识点当做一个扩散点,去扩展一些原来不知道的 像这篇,其实讲隐式转换的文章还是比较多,好的也比较多的 但可能我太小白了,有些一笔带过的内容比如说,原始值,引用值,toString,valueOf这些一笔带过 所以在讲之前先铺垫铺垫 讲些原理 PS: 小白一个 欢迎吐槽 嘿嘿嘿

原始值和引用值

原始值

存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。

Undefined、Null、Boolean、Number 和 String 由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。

引用值

存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。

object,Array , 函数

存储在变量处的值是一个指针(point),指向存储对象的内存处。

var a = "i am string";typeof a; // "string"a instanceof String  //falsevar b = new String("i am a string");typeof b; // "object"b instanceof String  //true复制代码

WTF ???

WHY ???

一开始看这道题的时候满脸问号

其实吧 这是因为 "i am string" 他是一个原始值

But

"i am string".length // 8  这些本属于String的方法却能被调用复制代码

这是应为在必要时。js语言会把字符串字面量转换成String对象。也就是你并不需要显示的创建一个对象valueOf()

toString valueOf()

toString 使用方法

var x = {};console.log(x.toString());           //  [object Object]//特别的用法toString.call(new Date); // [object Date]toString.call(new String); // [object String]toString.call(Math); // [object Math]toString.call(undefined); // [object Undefined]toString.call(null); // [object Null]var x = [1,2,3];x.toString(); //返回'1,2,3'var x = function(){console.log('lalala')}x.toString();// 返回'function(){console.log('lalala')}'var x = 33333;x.toString();// 返回'33333'复制代码

网上copy的一段示例,接下来详细了解一下toString()常用语法

obj.toString();

这种使用形式可以把除null undefined外,所有对象转为字符串

//boolean类型true.toString()  //truefalse.toString()  // false//string类型var str = "stringlalala"str.toString()  //"stringlalala"复制代码

但是下面出现了一个非常好玩的现象

// Objectvar obj = {    name: "MrZss",    age: "23"};obj.toString(); //[object Object]// Arrayvar arr = ["MrZss","23"];arr.toString();  // "MrZss","23"//Datevar date = new Date();//date.toString() //   Wed Feb 27 2019 13:46:35 GMT+0800 (CST)// Number var num = 23;var num = 23;console.log(num.toString(2)); //10111 二进制console.log(num.toString(8)); //27 八进制console.log(num.toString(16)); //17 十六进制复制代码

问题来了 按理来说 Array Date这些对象toString方法 都是从Object对象继承来的呀。为什么表现完全不一样

友情提醒:Array,RegExp,Date,Number等内置对象中的toString重写了,用于本身的类型转化

Object.prototype.toString()

来来来 敲黑板画重点了

实在不行就一键翻译吧 [滑稽.jpg]

这一块我也去搜了搜大佬的资料,看这个理解的比较详细

所以,可以使用Object.prototype上的原生toString()方法判断数据类型

因为其他对象例如Array,Date的toString方法都没覆盖了 所以还是需要使用

Object.prototype.toString.call(value) 来调取

Object.prototype.toString.call(null);//”[object Null]”Object.prototype.toString.call(undefined);//”[object Undefined]”Object.prototype.toString.call(“abc”);//”[object String]”Object.prototype.toString.call(123);//”[object Number]”Object.prototype.toString.call(true);//”[object Boolean]”....就不一一列举了可以自己414复制代码

Object.prototype.toString.call、instanceof、typeof又有啥不同呢

typeof undefined //undefinedtypeof null //objecttypeof true //booleantypeof 1.11 //numbertypeof "lalala" //stringtypeof function(){} //functiontypeof new Object() //objecttypeof new Array()  //objecttypeof new RegExp() //object复制代码

typeof 的局限性

在于 像Array,RegExp,null都会被判断为object,这就很尴尬了,无法去判断这些内置对象的具体类型

instanceof 的局限性

在于你必须知道实际类型和父类型再去判断对与,,对未知构造函数构造的对象来说无法提前给定,constructor属性返回的值又不是预期的单纯的构造函数名。

Object.prototype.toString 的局限性

Object.prototype.toString 就非常牛批了,对所有的内建对象都能支持得非常好 唯一不好的地方 自定义的构建的对象,无法通过原型链去查父类型

Object.prototype.toString.call('');  //[object String]Object.prototype.toString.call(undefined); // [object Undefined]Object.prototype.toString.call(null); //[object Null]Object.prototype.toString.call(1111);  // [object Number]Object.prototype.toString.call(true);  //[object Boolean]复制代码

valueOf

这个方法在Array等对象中也会被覆写

表现形式如下

先盗一个MDN的图嘿嘿

好了铺垫完了,待会进入正题

转载于:https://juejin.im/post/5c7637fcf265da2dbb123eaa

你可能感兴趣的文章
HTML5 rotate 做仪表盘
查看>>
为什么说荆州松滋刘氏采穴堂是刘开七、刘广传的后裔
查看>>
React中使用Ant Table组件
查看>>
第四篇 快速、轻量、可扩展、易于使用的EmEditor
查看>>
MySQL删除小写记录
查看>>
用shell脚本收集查询IP信息的网站
查看>>
shiro整合oauth
查看>>
超级网管员——网络管理
查看>>
AjaxControltoolkit(工具包)安装步骤说明
查看>>
利用组策略进行的一次Windows主机安全整改
查看>>
Ruby语法学习笔记(1)
查看>>
Windows Phone 7 使用选择器(Chooser)
查看>>
QOS 之 WRED
查看>>
ASP.NET MVC5 知识点整理
查看>>
CCNP 640-892知识点中文精简解释
查看>>
listview适配器与加载过程详解
查看>>
SDN控制器列表
查看>>
LeetCode - 8. String to Integer (atoi)
查看>>
在两个php下session无法使用的问题
查看>>
说一说关于破解支付宝AR红包的事
查看>>