JavaScript有一些内置类型,还有很多常用的内置的方法,本文稍作总结,以备查阅。

值类型

我的理解,值类型是分配在栈上的,而引用类型(当然也包括引用类型内部的值类型)是分配在堆上的。值类型是不可以改变的,比如:

var s = "hello";
s = "hello2";

上述并没有将字符串"hello"改成"hello2",而是新创建了一个字符串"hello2",前一个字符串仍然存在(只不过无法访问了),并于当前作用域被回收时销毁。

值类型很简单,有五种:undefined,null,boolean,number,string,都通过字面量来创建。有两点需要注意

  • 值类型没有方法,诸如3.1415.toFixed(2)或者"hello".toUpperCase()的用法,实际上都已经对值类型进行了包装。
  • undefined和null的区别:前者通常表示一个不存在的/非法的值类型变量,后者表示一个不存在的/非法的引用类型变量。
  • number支持八进制012和十六进制0xA的字面值。

包装类型

在值类型变量上调用函数或方法,浏览器会事先对其进行包装为对象,然后调用该对象的相关方法,如3.1415.toFixed(2),就是先把值类型包装为内置的Number类型,然后调用Number类型的toFixed方法。我们也可以显式地进行手动包装:

var n = new Number(3.1415);

包装类型的实例可以看做是临时对象,在调用过需要的函数后就不能再访问了,因此其上的方法不会影响变量原先的值。比如:

var x = 3.1416;
x.name = "PI"; // var tmpx = new Numer(x);
// tmpx.name = "PI";
console.log(x.name);

包装类型有很多有用的内置方法:

Number

在值类型变量或字面量(为方便,举例都在字面量上直接调用,下同)上调用方法:

  • toFixed(n):指定小数位数,如21.628.toFixed(2)返回"21.628"。
  • toExponential(n):指定小数位数并以科学计数法输出,如21.628.toExponential(2)返回"2.16e+1"
  • toPrecision(n):指定有效数字位数,如21.628.toPrecision(4)返回"21.63"。如果精度不到个位,以科学计数法表示,如21.628.toPrecision(1)返回"2e+1"。

注意,以上三个方法返回的都是字符串。

String

在值类型变量或字面量上调用方法:

  • charAt(i):返回字符串中指定位置的字符(返回的类型还是字符串),如"hello".charAt(1)返回"e"。
  • charCodeAt(i):返回指定位置字符编码,如"hello".charCodeAt(1)返回"101"。
  • concat(arguments):连接字符串,接收任意多个参数。如"hello".concat(" world", "!")返回"hello world!"。但实际上,我们更常使用+运算符连接字符串。
  • slice(i1, i2):返回指定两个索引值间的字串,如"hello world".slice(3, 7)返回"lo w"。如果i2没有指定,默认为最后一个字符的索引值。
  • substring(i, n):返回从指定索引值开始,具有某个长度的子串,如"hello world".substring(3, 7)返回"lo worl"。如果n没有指定,效果与slice一致。
  • substr(i1, i2):与slice(i1, i2)相同。唯一区别在于索引值i为负的时候,如"hello".substr(-3, 4)会被转化为"hello".substr(5-3, 4)返回"ll",而substr(-3, 4)会被转为"hello".substr(0, 4)返回"hell"。
  • indexOf(s, i):从索引值i的位置顺序搜索字符串,返回子串第一次出现的位置,若不设定i,默认为0。
  • lastIndexOf(s, i):从索引值i的位置逆序搜索字符串,返回子串第一次出现的位置,若不设定i,默认为length-1。
  • trim():删除所有前置和后置的空格,如"  hello world! ".trim()会返回"hello world!"。
  • toLowerCase和toUpperCase():大小写转换,如"Hello".toUpperCase()会返回"HELLO"。
  • localeCompare(s):字典法比较两个字符串大小,如"bag".localeCompare("bad")返回1,而"bag".localeCompare("baggage")返回-1。

字符串的模式匹配方法记录在正则表达式的章节。

引用类型

引用类型,也就是对象(object)。对象可以通过对象字面量来创建,也可以通过对象字面量来创建,也可以通过构造函数来创建。JavaScript的内置对象包括Object,Array, Date, Math, Function,RegExp,它们都继承自Object类型。继承的相关知识留在专门章节总结,函数和正则表达式也是。

Object

使用字面量创建的对象就是Object类型。Object类型的方法主要包括,注意其他内置方法也很可能有类似的方法,他们都(覆盖式地)继承自Object方法。

Array

  • 可以通过字面量[1, "hello", {x:3}]创建数组,也可以通过构造函数new Array(20)或new Array(1, "hello", {x:3})创建数组。数组内置方法较多:
  • toString(s):以逗号(默认)或其他分隔符输出数组(即对数组中每个元素调用toString()方法并用分隔符相连),如[1, "hello", {x:1}].toString(";")返回"1;hello;[object object]"。
  • push(ele)和pop():从数组尾端压入或弹出元素。
  • unshift(ele)和shift():从数组前端压入或弹出元素。
  • reverse():反转数组。
  • sort(func):升序排序数组,默认将数组中的所有元素转化为字符串排序(即使所有元素都是数字),如[10, 1, 5].sort会产生[1, 10, 5]。也可以利用参数func指定规则,func(v1, v2)如果v1<v2则返回-1(其实负值就行)。
  • concat(arguents):连接数组,可以传入任意多个参数,如[1, 2].concat(3, [4, 5], 6)会返回[1, 2, 3, 4, 5, 6],注意该函数没有改变数组本身,而是返回了一个新对象。
  • slice(i1, i2):提取子数组,与String中的slice类似,同样没有改变原数组,而是返回了新的对象。
  • splice(i1, i2, ele1, ele2, ele3, ...):强大的方法,可以删除、插入、替换数组中的项。
    • 删除:[1, 2, 3, 4, 5].splice(1, 3)会返回[2, 3, 4]而使原数组变成[1, 5]。
    • 插入:[1, 2, 3].splice(2, 0, -1, -3)会返回[]而使原数组变成[1, 2, -1, -3, 3]。
    • 替换:[1, 2, 3, 4, 5].splice(2, 2, -1, -2)会返回[3, 4]而使原数组变成[1, 2, -1, -2, 5]。
  • indexOf(ele, i)和lastIndexOf(ele, i),返回指定元素的索引值,参考String类型的同名函数。
  • some(func):对每一项执行func,若有一项返回true,该函数返回true。如[1, 2, 3].some(function(ele){return ele<1;})返回false。
  • every(func):数组中的每一项都使func返回true,则返回true。如[1, 2, 3].every(function(ele){return ele<5})返回true。
  • filter(func):返回一个子数组,其中的每一项元素都使func返回true。如[1, 2, 3].filter(func(ele, index){return index%2 == 0;})返回[1, 3]。
  • forEach(func):对每一项元素都执行func,无返回值。如var arr=[]; [1, 2, 3].forEach(function(ele, index){arr.push(index);})返回[0, 1, 2]。
  • map(func):对每一项元素执行func,并返回由返回值构成的数组。如[1, 2, 3].map(function(ele){return -ele;})返回[-1, -2, -3]。
    • 以上五个迭代方法,func的签名都是func(ele, index, arr),三个参数分别表示数组项、索引值和原数组。如果想改变原数组,可使用arr[index]。
  • reduce(func, ori):归并所有项并构建一个最终返回值,func为归并方法。如[1,2,3].reduce(function(prev, cur){return prev*2+cur}, -1)返回3,即(((-1)*2+1)*2+2)*2+3。
  • reduceRight(func, initial):迭代从数组尾部开始。

    • 以上两个归并方法func的签名是func(prev, cur, index, arr),分别表示前一项,当前项,索引值和原数组。第一次归并时,prev取ori,若ori没有指定,默认为0。

JavaScript备忘录(1)——内置类型的更多相关文章

  1. javascript 内置类型

    JavaScript有七种内置类型: 空类型:null 未定义:undefined 布尔:boolean 数字:number 字符串:string 对象:object 符号:symbol(ES6新增) ...

  2. javascript 判断对象的内置类型

    判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法.在toString方法被调用时,会执行下面的操作步骤:1. 获取this对象的[[Class ...

  3. Dart基础学习02--变量及内置类型

    Dart基础学习02--变量及内置类型 Dart中的变量 首先看一个变量的定义和赋值 var name = 'Bob'; 在Dart中变量名都是引用,这里的name就是一个指向值为Bob的字符串的引用 ...

  4. golang的内置类型map的一些事

    golang的map类型是一个比较特殊的类型,不同于int, string, byte这样的基本类型,在经过一番探究之后得出了一些结论: 1.golang的map类型虽然是内置类型,但和基本类型有很大 ...

  5. Python——内置类型

    Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...

  6. javascript中的内置对象

    2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...

  7. C++内置类型对象之间的转换

    C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上. 隐式类型转换发生在下列这些典型情况下. 1. 在混合类型的算数表达式中 规则:在这种情况下最宽的数据类型成为目标转 ...

  8. C++ - 内置类型的最大值宏定义

    内置类型的最大值宏定义 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24311895 C++中, 常常会使用, 某些类型的最大值 ...

  9. C++基本内置类型

    C++基本内置类型 基本内置类型包括算术类型和空类型. 算术类型 算术类型包括整型和浮点型. 类型 含义 最小尺寸 bool 布尔型 - char 字符型 8 bit wchar_t 宽字符型 16 ...

随机推荐

  1. 基于.NET的Excel开发:单元格区域的操作(读取、赋值、边框和格式)

    引用 using Excel = Microsoft.Office.Interop.Excel; 定义 Excel.ApplicationClass app; Excel.Workbooks book ...

  2. Git 操作 学习资源 网址

    用git 有一段时间了,有点自己的小心得.个人觉得相对SVN来讲他更灵活,更合理. 陆陆续续的收集了一些学习资源: 1.理解Xcode 中的Git 版本控制 http://www.open-open. ...

  3. PHP类与面向对象(二)

    构造函数和析构函数 构造函数PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作.如果子类中定义了构造 ...

  4. Vue.js:轻量高效的前端组件化方案(转载)

    摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...

  5. Delphi XE8,C++ Builder XE8,RAD Studio XE8 官方 ISO 文件下载,附激活工具

    RAD Studio XE8 v22.0.19027.8951 官方ISO下载(6.72G):http://altd.embarcadero.com/download/radstudio/xe8/de ...

  6. Activiti 查询最新版本的流程定义

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...

  7. windows环境下Eclipse开发MapReduce程序遇到的四个问题及解决办法

    按此文章<Hadoop集群(第7期)_Eclipse开发环境设置>进行MapReduce开发环境搭建的过程中遇到一些问题,饶了一些弯路,解决办法记录在此: 文档目的: 记录windows环 ...

  8. Unity3D去掉全屏时的屏幕黑边

    给全屏后不在乎拉伸变形仍想让画面占满屏幕的朋友,网上搜了一上午,实在是没有相关的资料,只能自己琢磨了. 使用Canvas Scaler在全屏后Unity虽然会为我们自动拉伸UI,但拉伸后仍然保持我们在 ...

  9. 奇怪吸引子---WangSun

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  10. SVN的文件夹链接(目录链接,目录映射,svn:externals)

    首先大家可以看下SVN的文件夹链接太强大了!(目录链接,目录映射,svn:externals),我就是看了这篇文章才敢大刀阔斧的把项目里的外链修改成正确的链接. 问题: 我们的项目里,服务器脚本工程s ...