Javascript(1):类型、值和变量(到对象)

本文深入探讨JavaScript的数据类型,包括原始类型(number、string、boolean、null和undefined)和对象类型(对象、数组、函数)。介绍了JS中的对象创建、属性操作、属性特性、对象的可扩展性及序列化。此外,还讨论了对象方法、数组和函数的特性。文章强调了原始值的不可变性以及对象的可变性,并阐述了如何在JavaScript中进行类型转换和内存管理。
摘要由CSDN通过智能技术生成

JS数据类型分为两类:

  1. 原始类型*:number、string、boolean;(特殊原始值:null和undefined);原始值是不可更改的。

  2. 对象类型:对象、数组、函数;
    如果使用函数来初始化一个新建对象,则称之为构造函数,每个构造函数定义一个类对象,这类对象是由构造函数初始化的对象组成的集合。eg:Array类、Function类、Date类、RegExp类、Error类

JS解释器内存管理机制
可以自动对内存进行垃圾回收;当不再有任何引用指向一个对象,解释器就会知道这个对象没用了,自动回收它所占用的内存资源。

直接量:
就是程序中直接使用的数据值。

12             //数字整型直接量
1.2            //浮点数整型直接量
"hello world"  //字符串文本
true           //布尔值
/javascript/gi //正则表达式直接量
null           //空

原始类型

数字

  • 不区分整数值和浮点数值,所以不存在C语言里面的2/3=1的情况,JS采用IEEE-754这种二进制表示法可以精确的表示分数,但不能精确的表示类似0.1这样的简单数字,在任何二进制浮点数的编程语言都有这个问题,如下:
var x = 0.3-0.2;
var y = 0.2-0.1;
console.log(x==y);   //false
console.log(x==0.1); //false
console.log(y==0.1); //true
  • 除十进制整数直接量以外,JS还能识别十六进制值。但某些JS的实现支持八进制直接量,有些不支持,因此最好不要使用0为前缀的整形直接量,ES6严格模式下八进制明令禁止。
  • 算术运算在溢出、下溢或被0整除时不会报错,上溢结果为无穷大值(用Infinity表示),下溢无穷小值(用-Infinity),基于这两者的加、减、乘除结果还是无穷大或无穷小。
  • 0除以0是没有意义的,这种运算的结果是NaN(无穷大除以无穷大、给负数开平方等结果为非数字值的运算结果均为NaN);
var zero = 0;
var negz = -0;
console.log(zero === negz);  //非数字值和任何值都不相等,包括自身
console.log(1/zero === 1/negz);  //所有判断是否为非数值应该用x!==NaN来判断
  • 当负数发生下溢时,返回一个特殊的值“-0”,这个值几乎和正常的0完全一样,但很少用到;

字符串

  • 由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集。JS中并没有表示单个字符的“字符型”,要表示一个16位值,只需要将其赋值给字符串变量即可,该字符串长度为1。字符串也可以当做只读数组,通过访问数组的方式访问。

采用UTF-16编码的Unicode字符集

  • 字符串提供了许多可以调用的方法
    但因为字符串是不可变的,因此以下方法虽然表面看起来获取到了更改以后的字符串的值,但实际上是返回了一个新的字符串,而以前的字符串本身没有任何改变。
var s = "hello world";
s.charAt(0);  //查询下标为0处的字符
s.length;     //返回字符串长度
s.slice(1,4); //截取下标1-4不包括4)的字符串
s.slice(-3);  //截取倒数三个字符
s.indexOf("l"); //l字符首次出现的位置
s.lastIndexOf("l"); //l最后出现的位置
s.split(", ");    //分割为字串:["hello", "world"]
s.replace("h", "H");   //将h替换为H
s.toUpperCase();       //字母均转为大写字母

//不可更改
console.log(s);  //还是hello world
........

布尔值

任意的值都可以转换为布尔值,这些(undefined\null\0-0\NaN" ")会被转为false.


null和undefined

null和undefined的异同:
null是一个表示”无”的对象,可以将null认为是一个特殊的对象值,而含义是“非对象”。undefined是一个表示”无”的原始值,转为数值时为NaN。当声明的变量还未被初始化时,变量的默认值为undefined;

(1)Null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象

(2)Undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:

a、变量被声明了,但没有赋值时,就等于undefined

b、调用函数时,应该提供的参数没有提供,该参数等于undefined

c、对象没有赋值属性,该属性的值为undefined

d、函数没有返回值时,默认返回undefined

对象类型

对象

类属性:对象的类属性是一个字符串,用以表示对象的类型信息。通过classof( )函数可以返回任意对象的类,可以传入任何类型的参数,以下是其代码:

function classof(o){
   
  if(o === null) return "Null";
  if(o === null) return "Undefined";
  return Object.prototype.toString.call(o).slice(8, -1);
}
console.log(classof([]);  //"Array"

对象直接量、Object.creat( )、自定义构造函数创建的对象类属性均为"Object"。

全局对象

当JS解释器启动时(或者任何Web浏览器加载新页面的时候),它将创建一个新的全局对象,并给它一组定义的初始属性:包括全局属性(undefined、NaN、Infinity…)、全局函数(isNaN()、eval()…)、构造函数(Date()、String()、Object()…)、全局对象(Math、JSON…);
Javascript中全局变量就是全局对象的属性。

//在代码的最顶级,在不在任何函数内的JavaScript代码,可以使用Javascript关键子this来引用全局对象:
var global = this;   //定义一个引用全局对象的全局变量

在客户端Javascript中,其表示的浏览器窗口中的所有JavaScript代码中,Window对象充当全局变量,其有一个属性window引用自身,可以代替this。


包装对象

字符串不是对象为什么会有属性和方法呢?因为一旦引用了字符串的属性,JS就会自动将字符串通过new String(字符串)的方式转换为对象,该对象继承了字符串的方法,并用来处理属性的引用,一旦引用结束该对象就立即销毁

var s = "hello";
console.log(s.length);  //5,此处引用完成,立即销毁
s.len = 4;              //再次转为对象,给该对象设置一个属性,引用完成立即销毁
console.log(s.len);     //undefined

其他数据类型同理:String( )、Number( )、Boolean( ),也可通过此构造方法显式的创建包装对象。


原型(prototype)
每个JS对象(null除外)都和另一个对象相联系,并且从另一个对象那里继承属性,另一个对象即为该对象的原型,所有通过对象直接量创建的对象都具有另一个原型对象,可以理解为Java中子类和父类的关系。

  • 要想检测一个对象是否是另一个对象的原型(或处于原型链中),使用is.PrototypeOf( )方法,p.isPrototypeOf(o)是检测p是否为o的原型。

创建对象

a. 对象直接量
对象直接量是一个表达式,这个表达式的每次运算都创建初始化一个新的对象。所以如果在一个重复调用的函数中循环体内使用了对象直接量,它将创建很多新对象。

var book = {
   
	"main point" : "Javascript",           //属性名空格必须引号
	"sub-title": 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值