资讯专栏INFORMATION COLUMN

【读书笔记】JavaScriptの类型

cjie / 3634人阅读

摘要:函数类型检测是的子类型,其属性为参数个数,但是判断结果有内建函数原生函数常见的有,可能被当作构造函数来使用,创建出来的是封装了的基本类型值。构造函数可以不带关键字。建议使用和来进行显示强制转换。

前言

此篇小结来源与《你不知道的JavaScript》和《JavaScript高级程序设计》的结合??或许是的,龟速总结中...

七种内置类型

null

undefined

boolean

number

string

object

symbol

除了object,其他都成为基本类型
变量没有类型,值才有。
typeof总返回一个字符串。

null

类型检测
因为typeof检测null的结果为object,所以在判断的时候需要这样判断:

var a = null;
(!a && typeof null === "object"); //true
undefined

类型检测

typeof undefined === "undefined"; //true

变量未持有值是undefined,但并不是未声明,不过下面结果都是undefined:

var a;
typeof a;  //"undefined"
typeof b;  //"undefined"

安全防范
防止出现直接抛出未声明的错误,不能直接用if(变量)的方法来判断变量是不是存在,可以用以下两种方法:

if(typeof DEGUB  !== "undefined") {}
if(window.DEBUG) {}
boolean

类型检测

typeof true === "boolean"; //true
number

类型检测

typeof 42 === "number"; //true

JS并没有真正意义上的整数,使用双精度格式(64位),42.0等同于42。

数字表示

默认十进制表示,小数最后的0被省略。

特别大和特别小的用指数显示,与用toExponential()结果相同。

数字前面的0可省略。

小数点后小数最后的0也可以省略。

调用Number.prototype的方法:toFixed()显示小数位数。

调用Number.prototype的方法:toPrecision()指定有效数位的显示位数。

注意:运算符会优先认为是有效数字字符

42.toFixed(3); //SynataxError
(42).toFiex(3); //42.000
0.42.toFixed(3); //0.420
42..toFixed(3); //0.420
42 .toFixed(3); //42.000

string

类型检测

typeof "42" === "string"; //true

字符串和字符串数组

都是类数组,有length属性,有indexOf()和concat()方法。

字符串不可变(创建返回新值),数组可变,但a[i]在老版本IE中不允许,正确用a.CharAt(i)。

字符串可以借用方法处理,如:Arrray.prototype.join.call(a,"-");

数组有reverse()方法,字符串没有。可以用以下方法(对复杂字符如Unicode、星号不适用):

var c=a.split().reverse().join("");

object

typeof返回object对象都包含一个内部属性[[Class]],但这个属性无法直接访问,
可以通过Object.prototype.toString.call()查看

Object.prototype.toString.call([1,2,3]);
// "[object Array]"

Tips:若是基本类型值,null和undefined

Object.prototype.toString.call(null);
// "[object Null]"
Object.prototype.toString.call(undefined);
// "[object Undefined]"

而其他的基本类型,会被包装为相应的封装对象。

函数

类型检测
function是object的子类型,其length属性为参数个数,但是typeof判断结果有function:

type of function a(){} === "function"; //true

内建函数/原生函数:
常见的有String()、Number()、Boolean()、Array()、Object()、Function()、RegExp()、Date()、Error()、Symbol(),可能被当作构造函数来使用,创建出来的是封装了的基本类型值。

Tips:
typeof返回的是对象类型的子类型。
万不得已,不使用Object()、Function()、RegExp()。
Date.now()获取当前时间戳,在ES5之前是Date.getTime()。
ES5开始,使用Object.create(null)创建的对象[[Prototype]]属性为null,且没有valueOf()和toString()方法。

数组

类型检测
数组也是object的子类型

type of [1,2,3] === "object"; //true

类数组转换
1.slice()常用于把类数组转换为数组:

Array.prototype.slice.call(arguments);

2.ES6中的Array.from(arguments)实现相同作用。

Array(...)
Array(...)构造函数可以不带new关键字。
若只有一个参数,参数会被作为数组的预设长度(只是length变化了)。而且在不同浏览器中显示的结果也有点差异。map()遍历会失败,而join()会成功,它假定数组不为空,然后通过length来遍历。

var a = Array.apply(null,{length: 3});
a; // [undefined,undefined,undefined]

可以这样代替创建。

注意点
delete可以把元素删除,但length并不会发生变化。

封装/拆封

可以用Object()还能输自行封装。
拆封对象可以用valueOf()函数。

symbol

符号是具有唯一性的特殊值,用它来命名对象属性不容易导致重名,但控制台无法直接访问它的值。
类型检测

typeof Symbol() === "symbol"; //true

定义
ES6z中一些预定义符号,以Symbol静态属性形式出现,如Symbol.create、Symbol.iterator等。

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

定义时候不能带new关键字。
通过Object.getOwnPropertySymbols()可以获得。

类型转换

JS的强制转换总返回标量基本类型值
类型转换发生在静态语言的编译阶段,强制转换发生在动态类语言运行时。

ToString

基本类型字符串转化规则:
null -> null、undefined -> undefined
数字遵循通用规则,包括极小、极大、以及指数形式。

普通对象转化规则:
除非自行定义,否则返回内部属性[[Class]]值。

JSON字符串化
JSON.stringify(...)
不安全的JSON值,如undefined、function、symbol和包含循环引用的都无法处理。
在对象里遇到undefined、function和symbol会自动忽略,在数组中返回null(保证位置不变)。

ToNumber

true -> 1
false -> 0
undefined -> NaN
null -> 0

处理失败返回NaN,对0开头的十六进制数不按十六进制处理,按十进制。
对于对象,会先转换为相应基本类型,再操作,先检查valueOf()再用toString(),若都不返回基本类型值,产生TypeError错误。

~运算符

~返回2的补码,大致等同于-(x+1)。

var a = "Hello World";
if(~a.indexOf("lo")){ //...}

~~来截除字符串,只适用于32位数字,对负数的处理也不太一样。X|0也可以。

Number()、parseInt()

Number不允许解析字符串有非数字字符。
parseInt()的第一个字符是x或者X,转换为十六进制数字。0则转换为八进制数字。

Boolean

建议使用Boolean(a)和!!a来进行显示强制转换。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107471.html

相关文章

  • 基本方法笔记 - 收藏集 - 掘金

    摘要:探讨判断横竖屏的最佳实现前端掘金在移动端,判断横竖屏的场景并不少见,比如根据横竖屏以不同的样式来适配,抑或是提醒用户切换为竖屏以保持良好的用户体验。 探讨判断横竖屏的最佳实现 - 前端 - 掘金在移动端,判断横竖屏的场景并不少见,比如根据横竖屏以不同的样式来适配,抑或是提醒用户切换为竖屏以保持良好的用户体验。 判断横竖屏的实现方法多种多样,本文就此来探讨下目前有哪些实现方法以及其中的优...

    maochunguang 评论0 收藏0
  • 读书笔记:编写高质量javascript的68个方法

    摘要:第条尽量少使用全局对象避免声明全局变量尽量声明局部变量避免对全局变量增加属性第条始终声明局部变量第条避免使用语句第条熟练使用闭包的函数值包含了比调用他们时执行所需要的代码还要更多的信息。那些在其所涵盖的作用域内跟踪变量的函数称为闭包。 书还没看完。一遍看,一遍写读书笔记。 这本书的序是JavaScript之父Brendan Eich写的,作者是JavaScript标准化委员会专家。可想...

    Vicky 评论0 收藏0
  • Effective JavaScript读书笔记(一)

    摘要:如果为假值,不传或者传入,函数都会返回但是,传入这个值是完全有可能的,所以这种判断形势是不正确的或者使用来判断也可以原始类型优于封装类型对象拥有六个原始值基本类型布尔值,数字,字符串,,和对象。 作为一个前端新人,多读书读好书,夯实基础是十分重要的,正如盖楼房一样,底层稳固了,才能越垒越高。从开始学习到现在,基础的读了红宝书《JavaScript高级程序设计》,犀牛书《JavaScri...

    zhoutao 评论0 收藏0
  • 读书笔记】你不知道的JavaScript--内置类型

    摘要:有种内置类型,分别是除对象之外,其他统称为基本类型。另一个需要注意的是数组确切地说,数组也是的一个子类型我们可以通过下面的方法检查变量是不是数组处理未声明的变量时,会返回这是因为有一个特殊的安全防范机制。 js有7种内置类型,分别是undefined null boolean string number symbol object除对象之 Object 外,其他统称为基本类型。符号 ...

    Integ 评论0 收藏0
  • JavaScript高级程序设计》读书笔记

    摘要:为了每个对象都能通过来检测,需要以或者的形式来调用,传递要检查的对象作为第一个参数,称为。对象都是动态的,这就意味着每次访问对象,都会运行一次查询。是语言中立的用于访问和操作和文档。 一、第三章 基本概念: 1.理解参数 1.1 可以向函数中传递任意数量的参数,并且可以通过arguments对象来访问这些参数。 1.2 arguments对象只是类似数组,它通过length来确定传进来...

    dayday_up 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<