JavaScript 数据类型
- JavaScript数据类型有这么几种:number、string、boolean、undefined(只有一个值undefined,在变量声明但没有初始化的时候,默认值就是undefined)、null(你可以理解为指向空对象的指针)、object。
- NaN 是number类型,小数点前边是0的小数0可以省略,NaN的判断请用函数isNaN(),别的都不好使。
- typeof 关键字可以用字符串输出变量的类型(以字符串形式)。
- instanceof 关键字可以判断某个实例是不是某个类。
- null instanceof object == false 。
- typeof null 的结果是“object”。
- 函数名也是指向函数的一个指针(类似于C++的函数指针),所以,函数名 instanceof Function == true。
- 所有引用类型(当然除了空指针null)都是Object的实例,所有的函数都是Function的实例。
- 浮点数比较大小请用差值和阈值比较,别用更别用=。
- ==比较的是值相不相等,===比较的是类型和值都要相等。
function printInfo(obj){
console.log(obj + "是" + typeof obj);
}
printInfo(12);
printInfo(12.2);
printInfo(.23);
printInfo(2.2e-2);
printInfo(NaN);
printInfo(Infinity);
printInfo(undefined);
printInfo("123");
printInfo("undefined");
var arr = [1,2,3];
printInfo(arr);
printInfo(null);
printInfo(true);
printInfo(2 > 3);
printInfo(printInfo);
console.log(printInfo instanceof Function);
console.log(printInfo instanceof Object);
console.log(Function instanceof Object);
var a;
console.log(a);
console.log(a === undefined);
console.log(1/3 == (1 - 2/3));
console.log((1/3 - (1 - 2/3)) < 0.000001);
console.log("123" == 123);
console.log("123" === 123);
万物皆对象
- 一切引用类型都是Object的实例,那基本类型咋办?Java咋做的,引入了包装类(比如int 和 Integer,double 和 Double),js也这么干了,number和Number, string和String,boolean和Boolean,所以在JavaScript中,万物皆对象这句话没问题。
- 更牛逼的是,基本类型竟然能够使用引用类型的方法!你比如在String.prototype添加方法,基本类型string的字符串也能使用(个人觉得可能是原型把基本类型自动转成引用类型了)。
String.prototype.myfunction = function(){
console.log("我是新添加的方法");
}
var str1 = "abc";
var str2 = new String("abc");
var str3 = String("abc");
console.log(typeof str1);
console.log(typeof str2);
console.log(typeof str3);
str1.myfunction();
str2.myfunction();
str3.myfunction();
Number.prototype.newfunction = function(){
console.log("我也是新添加的方法");
}
var number1 = 1;
var number2 = new Number(1);
var number3 = Number(1);
console.log(typeof number1);
console.log(typeof number2);
console.log(typeof number3);
number1.newfunction();
number2.newfunction();
number3.newfunction();
JS常用的类(以后细说)
- Array(我个人管它叫列表,受Java影响,数组都是不可变长度)
- Date(日期类)
- String(字符串)
- Math(数学操作)
Array
var list = [];
list.push(1);
list.push("123");
console.log(list);
list.pop();
console.log(list);
list.push(new Date());
list.push("string");
list.push({});
console.log(list);
list[1] = "123";
console.log(list);
var arr = ['aa','cc','bb','cc','dd'];
var re = arr.indexOf('cc');
var re2 = arr.indexOf('cc',2);
var arr1 = [1,2,3];
var arr2 = [4,5,6];
console.log(arr1.concat(arr2));
console.log(arr1);
var arr1 = [0,1,2,3,4,5,6,7];
arr1.splice(0,2,"a","b");
console.log(arr1.toString());
arr1.splice(0,0,"c");
console.log(arr1.toString());
console.log(arr1);
console.log(arr1.reverse());
console.log(arr1);
console.log(arr1);
console.log(arr1.slice(1,5));
console.log(arr1);
console.log(arr1);
console.log(arr1.join("-"));
console.log(arr1);
Date
var date = new Date();
var a = date.getDate();
console.log("===getDate===:"+a);
var b = date.getDay();
console.log("===getDay===:"+b);
var c = date.getFullYear();
console.log("===getFullYear===:"+c);
var d = date.getHours();
console.log("===getHours===:"+d);
var e = date.getMilliseconds();
console.log("===getMilliseconds===:"+e);
var f = date.getMinutes();
console.log("===getMinutes===:"+f);
var g = date.getMonth();
console.log("===getMonth===:"+g);
var h = date.getSeconds();
console.log("===getSeconds===:"+h);
var k = date.getUTCDate();
console.log("===getUTCDate===:"+k);
var l = date.getUTCDay();
console.log("===getUTCDay===:"+l);
var m = date.getUTCFullYear();
console.log("===getUTCFullYear===:"+m);
var o = date.toDateString();
console.log("===toDateString===:"+o);
var p = date.toISOString();
console.log("===toISOString===:"+p);
var q = date.toJSON();
console.log("===toJSON===:"+q);
var r = date.toLocaleDateString();
console.log("===toLocaleDateString===:"+r);
var s = date.toLocaleString();
console.log("===toLocaleString===:"+s);
var t = date.toLocaleTimeString();
console.log("===toLocaleTimeString===:"+t);
var u = date.toTimeString();
console.log("===toTimeString===:"+u);
var dt = new Date();
console.log(dt.toString());
console.log(dt.toLocaleString());
console.log(dt.toDateString());
console.log(dt.toLocaleDateString());
console.log(dt.toTimeString());
console.log(dt.toLocaleTimeString());
console.log(dt.valueOf());
String
var str = "1234string23e240";
console.log(str.charAt(1));
console.log(str[1]);
console.log(str.indexOf("23"));
console.log(str.lastIndexOf("23"));
console.log(str.replace("12","--"));
console.log(str);
console.log(str.slice(0,5));
console.log(str.split("string"));
console.log(str.toUpperCase());
console.log(str);
console.log(str.toLowerCase());
console.log(str);
str = " sdfasfdf fdssfsd ";
console.log(str.trim());
console.log(str);
Math
var rand = Math.random();
console.log(Math.floor(2.15));
console.log(Math.ceil(2.15));
console.log(Math.round(3.14));
JSON
var jsonStr = '{ "name": "haorooms", "sex": "man" }';
var jsonObj = { "name": "haorooms", "sex": "man" };
console.log(typeof jsonStr);
console.log(typeof jsonObj);
var obj1 = JSON.parse(jsonStr);
console.log(obj1);
console.log(typeof obj1);
var str1 = JSON.stringify(jsonObj);
console.log(str1);
console.log(typeof str1);
JS面向对象
- js是动态语言,可以动态添加属性和方法!!!
- js本身没有class的概念,但是可以通过原型等方法实现面向对象(封装、继承、多态)。
- 通过类名,new出一个对象的过程,叫做"类的实例化"。
- this关键字是指向自己的一个指针,在类中,必须使用this.属性或者方法名访问。谁调用了函数,this就指向谁。
- constructor返回对象的构造函数,instanceof 用来判断该对象是否是这个类的实例。
- this的指向问题:
①通过函数名()调用的,this永远指向window
②通过对象.方法调用的,this指向这个对象。
③函数作为数组中的一个元素,用数组下标调用的,this指向这个数组
④函数作为window内置函数的回调函数使用,this指向window。
setInterval setTimeout 等。
⑤函数作为构造函数,使用new关键字调用,this指向新new出的对象。
var person = new Object();
person.name = "张三";
person.age = 20;
person.job = "程序员";
person.sayName = function(){
console.log(this.name);
}
person.sayName();
person = {
name : '张三',
age : 20,
job : '程序员',
sayName : function(){
console.log(this.name);
}
};
person.sayName();
person.name = "123";
person.sayName();
console.log(person.constructor);
function createPerson(name,age,job){
var p = {};
p.name = name;
p.age = age;
p.job = job;
p.sayName = function(){
console.log(this.name);
}
return p;
}
var p = createPerson('李四',21,'java程序员');
p.sayName();
console.log(p.constructor);
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype.sayName = function(){
console.log(this.name);
}
var person1 = new Person('王五',22,'php程序员');
var person2 = new Person('赵六',30,'技术经理');
person1.sayName();
console.log(person1.constructor);
console.log(person1 instanceof Person);
console.log(person1 instanceof Object);
console.log(person1.sayName === person2.sayName);
console.log(person1.prototype);
console.log(Person.prototype.isPrototypeOf(person1));
console.log(Person.prototype.isPrototypeOf(person2));
console.log(Object.getPrototypeOf(person1) === Person.prototype);
console.log(Object.getPrototypeOf(person1) == Person);
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse");
console.log(o.constructor);
console.log(o.name);
console.log(o.age);
console.log(o.job);
function Animal (name,sex) {
this.name = name || 'Animal';
this.sex = sex ;
this.sleep = function(){
console.log(this.name + '正在睡觉!');
}
}
Animal.prototype.eat = function(food) {
console.log(this.name + '正在吃:' + food);
};
function Cat(name,sex,age){
Animal.call(this,name,sex);
this.age = age || '20';
this.name = name || 'Tom';
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat = new Cat("小猫","female","25");
console.log(cat.name);
cat.sleep();
cat.eat("fish");
console.log(cat.sex);
console.log(cat.age);
console.log(cat instanceof Animal);
console.log(cat instanceof Cat);
console.log(cat);
function People(name){
this.name = name;
}
People.prototype.learning = function(){
console.log("I am a people, I am learning");
}
function Student(name,studentId){
People.call(this,name)
this.studentId = studentId;
Student.prototype = new People();
Student.prototype.constructor = Student;
}
Student.prototype.learning = function(){
console.log("I am a student, I am learning");
}
function Worker(name,workerId){
People.call(this,name);
this.workerId = workerId;
Worker.prototype = new People();
Worker.prototype.constructor = Worker;
}
Worker.prototype.learning = function(){
console.log("I am a worker, I am learning");
}
function peopleFactory(type){
switch (type){
case "student":
return new Student();
break;
case "worker":
return new Worker();
break;
default:
return new People();
break;
}
}
var person = peopleFactory("student");
person.learning();
person = peopleFactory("worker");
person.learning();