数据类型

52次阅读

共计 2788 个字符,预计需要花费 7 分钟才能阅读完成。

数据类型分类

  • 基础类型:string,number,boolean,undefined,null,symbol
  • 对象类型:object

基础类型为原始值,其值不能被修改;对象类型为引用类型,可以理解为指针,通过引用类型找到内存中的地址,然后再进行相关操作。

// 基本类型
var a = 10;
var b = a ;
a = 20;
console.log(b); // 10

// 对象类型
var c = {name:'hello'};
var d = c ;
c.name = 'world';
console.log(d.name); // 'world'

数据类型判断

  • typeof,获取值的所属类型以字符串形式返回
typeof 'hello'; // 'string'
typeof 123; // 'number'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof null; // 'object' (特例 1)
typeof Symbol('hello'); // 'symbol'

typeof {a:1} ; // 'object'
typeof function(){}; // 'function' (特例 2)

特例 1,属于基础类型的 null 经过 typeof 操作符操作后返回的是 object;特例 2,函数隶属于对象,typeof 操作直接返回 function

  • instanceof,可以判断通过 new 操作符生成的各种数据类型
var str = 'hello';
str instanceof String ; // false
new String('hello') instanceof String; // true

// number,booelan 同理,(null,undefined,symbol 没有构造函数)
123 instanceof Number; // false
new Number(123) instanceof Number ; // true

true instanceof Boolean; // false
new Boolean(true) instanceof Boolean; // true

instanceof 的实质是,判断 instanceof 左边 对象 的原型是不是在右边对象的 原型链 中。

  • toString,通过 Object 原型上的 toString 方法,判断对象所属类型
Object.prototype.toString.call('hello'); // "[object String]"
Object.prototype.toString.call(123); // "[object Number]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(Symbol('hi')); // "[object Symbol]"

Object.prototype.toString.call(function(){}); // "[object Function]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(new Date()); // "[object Date]"
Object.prototype.toString.call(/w+/); // "[object RegExp]"
Object.prototype.toString.call({}); // "[object Object]"

数据的操作方法

基本数据类型的所有方法操作都不改变原始值。

对象类型的数据,操作过程中始终留意引用地址的中转概念,其原型上方法有会改变和不改变原值的两种类型。

// 基本类型
var str = 'hello';
str.toUpperCase(); // 仅返回值为 'HELLO',并不是直接在原值上修改
console.log(str); // 'hello'

// 对象类型
// 改变值
var arr1 = [1,2,3];
arr1.push(4); 
arr1; // [1,2,3,4]

// 不改变值
var arr2 = [5,6,7];
arr2.concat(arr1); // 返回 [5,6,7,1,2,3,4]
arr2; // [5,6,7]

// 引用地址示例
var arr3 = [8,9]; // arr3 实则对应的是内存中 [8,9] 数组的引用地址,比如 x0001
var arr4 = arr3; // arr4 为 arr3 的值,即为 x0001
arr4[0]= 10; // 在对地址进行操作和读值时,则又通过引用找到对应的区域进行读写操作
arr3; // [10,9]

引用类型可以简单地类比成计算机中的快捷方式。

常用又较容易混淆的操作方法:

String

  • 剪切
方法名 说明
slice(start,end) start 和 end 都可以为负数,皆代表位置索引,从 start 往字符串右边向剪切,end 位置若在 start 左边,则返回为空,
substr(start,length) start 可为负,表示定位到剪切的起始位置,length 需为正数,表示从起始位置往右截取的长度。
substring(index1,index2) Index1 和 index2 都为正数皆代表位置索引,两者无序即总是取两者之间的字符

Number

  • toFixed(length),返回字符串;仅对小数点位后,做特定长度的截取,不够长度则补 0,四舍五入。
var num = 123.5368;
num.toFixed(2); // '123.54'
num.toFixed(1); // '123.5'
num.toFixed(6); // '123.536800'

Array

  • slice 和 splice
方法名 说明
slice(start,end) start 和 end 都可以为负数,皆代表位置索引,从 start 元素往数组右边浅拷贝,不包括 end 位置元素,end 位置若在 start 左边,则返回空数组(类似字符串的 slice),操作不影响原数组。
splice(start,len,…eles) start 代表索引位置,可为负;len 表示要删除的个数,eles 表示要在删除的位置中插入的元素,可多个。操作会影响到原数组。返回的为删除的元素数组。
var arr = [1,2,3,4,5,6,7,8];

// slice 
arr.slice(-4,-1); // [5,6,7]

// splice
var data = arr.splice(0,1,99); 
arr; // [99,2,3,4,5,6,7,8]
data; // [1]

正文完
 0

数据类型

52次阅读

共计 3905 个字符,预计需要花费 10 分钟才能阅读完成。

数据类型
ECMAScript 中有 5 种简单的数据类型(也称基本数据类型)和 一种复杂数据类型(也称引用类型)

基本数据类型:Undefined、Null、Boolean、Number、String
引用类型:object

1. Undefined
Undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其加以初始化时这个变量的值就是 undefined
var message;
alert(message == undefined); //true

2. Null
Null 类型是第二个只有一个值得数据类型,这个特殊的值是 null。null 值表示空指针对象,故使用 typeof 操作符检测 null 值时会返回 ”object”, 实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定对他们的相等性测试要返回 true
var car = null;
alert(typeof car); // “object”

alert(null == undefined) //true

3. Boolean
Boolean 类型是 ECMAScript 中使用得最多的一种类型, 该类型只有两个字面值:true 和 false。true 不一定等于 1,而 false 也不一定等于 0
var found = true;
var lost = false;

Boolean()
可以对任何数据类型的值调用 Boolean()函数,而且总会返回一个 Boolean 值。至于返回的是 true 还是 false, 取决于要转换值的数据类型及其实际值。下表给出了各种数据类型以及对其对应的转换规则。

数据类型
转换为 true 的值
转换为 false 的值

Boolean
true
false

String
任何非空字符串
”(空字符串)

Number
任何非零的数字值(包括无穷大)
0 和 NaN

Object
任何对象
null

Undefined
n/a(不适用)
Undefined

4. Number
1)NaN(Not a Number)
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数为未返回数值的情况(这样就不会抛出错误了)。但在 ECMAScript 中, 任何数值除以 0 会返回 NaN。NaN 有两个不同寻常的特点:

任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN
NaN 与任何值都不相等,包括 NaN 本身

alert(NaN == NaN); //false

2)isNaN()
函数,这个函数接受一个参数,该参数可以是任何类型,而这个函数会帮我们确定这个参数是否 ” 不是数值 ”。isNaN()在接收到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串 ”10″ 或 Boolean 值。而任何不能被转换为数值的值都会导致这个函数返回 true。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一个数值)
alert(isNaN(“10”)); //false(可以被转换成数值 10)
alert(isNaN(“blue”)); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1)

3)数值转换:Number()、parseInt()和 parseFloat()
转型函数 Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值
Number()函数的转换规则

如果是 Boolean 值 true 和 false 将分别被转换为 1 和 0
如果是数字值只是简单的传入和返
如果是 null 值,返回 0
如果是 undefined,返回 NaN

如果是字符串,遵循下列规则:

如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 ”1″ 会变成 1,”123″ 会变成 123,而 ”011″ 会变成 11(注意:前导的零被忽略了)
如果字符串中包含有效的浮点格式,如 ”1.1″,则将其转换为对应的浮点数值(同样,也会忽略前导零)
如果字符串中包含有效的十六进制格式,例如 ”0xf”,则将其转换为相同大小的十进制整数值
如果字符串是空的(不包含任何字符),则将其转换为 0
如果字符串中包含除上述格式之外的字符,则将其转换为 NaN

如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。

var num1 = Number(“Hello world!”); //NaN
var num2 = Number(“”); //0
var num3 = Number(“000011”); //11
var num4 = Number(true); //

2.parseInt()
3.parseFloat()
5. String
string 类型用于表示由零或者 16 位 Unicode 字符组成的字符序列,即字符串。字符串可以有双引号(”)或者单引号(’)表示,不过以双引号开头的字符串也必须以双引号结尾,而以单引号开头的字符串必须以单引号结尾。
var firstName = “Nicholas”;
var lastName = ‘Zakas’;
var firstName = ‘Nicholas”; // 语法错误(左右引号必须匹配)

1)字符字面量
string 数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。这些字符字面量如下表所示:

字面量
含义

\n
换行

\t
制表

\b
空格

\r
回车

\f
进纸

\
斜杠


单引号(’),在用单引号表示的字符串中使用。例如:’He said, ‘hey.”


双引号(”),在用双引号表示的字符串中使用。例如:”He said, “hey.””

xnn
以十六进制代码 nn 表示的一个字符(其中 n 为 0~F)。例如,x41 表示 ”A”

unnnn
以十六进制代码 nnnn 表示的一个 Unicode 字符(其中 n 为 0~F)。例如,u03a3 表示希腊字符 Σ

2)字符传的特点
ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就不能改变。要改变么讴歌变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。例如
var lang = “Java”;
lang = lang + “Script”;
3)转换为字符串
(1)toString()
数值、布尔值、对象和字符串值 调用 toString()都会返回字符串的一个副本,但 null 和 undefined 值没有这个方法。
var age = 11;
var ageAsString = age.toString(); // 字符串 ”11″
var found = true;
var foundAsString = found.toString(); // 字符串 ”true”

在调用数值的 toString()方法时,可以传递一个参数:输出数值的基数。默认以十进制格式返回数值的字符串表示,通过传递基数,toString()可以输出以二进制、八进制、十六进制,乃至其他任意有效进制格式表示的字符串值。
var num = 10;
alert(num.toString()); // “10”
alert(num.toString(2)); // “1010”
alert(num.toString(8)); // “12”
alert(num.toString(10)); // “10”
alert(num.toString(16)); // “a”

(2)String()
将任何类型的值转换为字符串。其转换规则如下:

如果值有 toString()方法,则调用该方法 (没有参数) 并返回相应的结果
如果值是 null,则返回 ”null”
如果值是 undefined,则返回 ”undefined”var value1 = 10; var value2 = true; var value3 = null; var value4; alert(String(value1)); // “10” alert(String(value2)); // “true” alert(String(value3)); // “null” alert(String(value4)); // “undefined”

6. Object
ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建的对象类型名称来创建。而创建 Object 类型的实例并为其添加属性和方法,就可以创建自定义对象,如下所示:
var o = new Object();

Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。Object 的每个实例都具有下列属性和方法。

constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数 (constructor) 就是 Object()。
hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty(‘name’))。
propertyIsEnumerable(propertyName): 用于检查给定的属性是否能够使用 for-in 语句来枚举。与 hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值相同

正文完
 0