前言
以前用js仅仅停留在会用而没有深入了解,闲下来看看发现自己对js了解实在太少。
下面仅仅是自己的理解,如有错误请指正,提前致谢。
正文
JS数据类型
5种原始类型
5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。
1个引用类型
引用类型全部是Object类型,如:Object、Array(数组)、Date(日期)、Function(函数)、Error(异常)、RegExp(正则表达式)、Math、Number(数字)、String(字符串)、Boolean(布尔)、Globle(全局)。这些引用类型全部继承自Object,Object 中的所有属性和方法都会出现在其他类型中,如toString()方法。
其实我们可以使用function来模拟上面的引用类型来自定义类型。如
function Person(){
this.name="bill";
}
var p=new Person();
其中Person也继承Object,p的类型是Object。
JS只有一种数字类型就是Number,64 位(8 比特),浮点数。所以不必纠结小数点问题。
JS对象(JSON)
JavaScript中,对象是拥有属性(property)和方法(function)的数据。你也可以称它为变量。
JS对象还有另一个让人熟悉的名字:JSON。
JavaScript对象,就是JSON(JavaScript Object Notation),对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式(name : value) 来定义,属性由逗号分隔。如:
var person = { firstname: "Bill", lastname: "Gates", id: 5566 };
对于Json,很多人都知道用于数据传输。这种理解没错,其实所有JS对象都能写成这种形式,比如字符串:
var c = '';
此时c就是一个JSON。可是c并没有{} 和key -value啊?其实这是Js的封装,比如字符串的属性length,我们可以看成
var c= { "length": 0 }
在Javascript中,所有声明的变量不论什么类型都是对象,都是JSON。
创建JS对象(JSON)
JS中创建JSON的方法只有一种,就是使用new构造函数来创建对象。
其实new更深层次的是调用了Object.create()方法,这里不详细讲了。
显式new引用类型
var s = new String();
var d = new Date();
var a = new Array();
var o = new Object();
var p=new Person(); //自定义的Person类型
使用原始类型隐式调用new对应包装类(引用类型)
五种原始类型中,number、string、boolean类型有其对应的包装类Number()、String()和Boolean()。
什么是包装类?
浏览器读取到原始值时会自动new相应的包装类创建对象,因此Number、String和Boolean类型被称为原始类型的“包装类型”。
var c="aaa";
这是声明一个字符串变量(对象)最简单的方式。
但其实编译时会自动调用包装类型,过程如下:
var c= new String("aaa");
其中number, string,boolean是分别拥有自己的包装对象,而undefined和null是没有自己的包装对象的。这是因为它们有其特殊意义。
使用原始类型创建的实例是不能直接赋予新的属性和方法的,下面详细讲解。
使用字面量(literal)隐式调用new
字面量:只代表自己数据。
浏览器读取到字面量时会自动new object()生成对象。
var a=['a']; //数组字面量
var p= { firstname: "John" }; //对象字面量
如何把属性和方法(函数function)添加到对象上。
创建对象时会自带一些属性和方法如length属性和toString()方法,那如何把新的属性和方法添加到对象上呢?直接添加就行了。
var c=new Object();
c.id=0; //为其附加新的id属性
c.id; //输出: 0
var p= { name: "John" };
p.id=0;
p.id //输出 0
p.changeName=function(){
return "adsion";
}
p.changeName(); //输出: "adsion"
很简单把,但是使用原始类型创建的对象不能这么做
var c="haha";c.id=0; c.id //输出 undefined
为什么不能访问原始值创建的实例的附加属性?难道没有附加上吗?并不是的,浏览器每次访问到原始值都会调用一次new 包装对象创建实例其实上面的代码过程时这样的:
var c="haha"; // var c=new String("haha");
c.id=0 ; // (new String("haha")).id=0
c.id; // (new String("haha")).id
你属性赋予了第一次访问时创建的实例,但是你再次访问时会创建一个新的实例,新的实例并没有这个属性,所以返回undefined。
使用原始值只能使用对应包装类自带的属性和方法。
这样直接附加属性方法固然简单,但是一般不用,因为很多时候你需要创建一个拥有固定有限属性的构造函数function;你当然可以直接function Per(){} ; var c=new Per();c.name =”haha”;但是我们期望代码中实例在创建后就拥有属性以便自动执行一些操作,而不会自己给它添加属性。
方法上没有函数名是隐式函数。
对象属性有两种寻址方式
var c="haha";
c.length // 4
c["length"] // 4
其它JS速记
js内置对象的方法使用小驼峰形式如toString()方法。
字符串string 单双引均可,可以在引号内使用另一个不同的引号。
var c=’my name is “bill” ‘;
JS拥有动态类型。这意味着相同的变量可用作不同的类型:
var c=0;c=”0”;
JavaScript for/in 语句循环遍历对象的属性。
this基本介绍:在window下使用this指的是window,用jquery在click的function里面使用this时,this指向的就是当前的节点,可以直接使用,很好用。