# 一、JavaScript
1、构造函数及实例化原理
1.1故意return一个非this的
function Car(){
this.color=color;
this.brand=brand;
return 123
return 'abc'
//return this
}
var car = new Car();
console.log(car.color)//red
当返回一个空对象
function Car(color, brand){
this.color=color;
this.brand=brand;
return {};
}
var car = new Car('red','banz');
console.log(car.color)//undefined
console.log(car)//空对象 {}
返回一个空数组
function Car(color, brand) {
this.color = color
this.brand = brand
return []
}
var car = new Car('red', 'banz')
console.log(car.color) //undefined
console.log(car) //空数组 []
返回一个函数
function Car(color, brand) {
this.color = color
this.brand = brand
return function(){}
}
var car = new Car('red', 'banz')
console.log(car.color) //undefined
console.log(car) //f(){}
总结:构造函数当中,return是引用值(函数 对 象 数组)是有用的。原始值(数字,字符等)是没有用的
function Car(color, brand) {
this.color = color
this.brand = brand
return function(){
cosole.log(1)
}
}
var car = new Car('red', 'banz')
console.log(car.color) //undefined
car()//1
老师说:JavaScript难在基础
2、包装类
2.1是否有属性和方法
var a =1;
var b= 'abc'
a.len =3
b.add='bcd'
a.reduce = function(){}
2.2原始值并没有自己的方法和属性。
var a = 1
console.log(a)
var b = new Number(a)//实例化一个内置对象
console.log(b)
var a = 1
var b = new Number(a)//实例化的对象数字
b.len = 1
b.add = function () {
console.log(2)
}
console.log(b)
2.3一个对象加上一个数字,也能参与运算
var a = 1
//console.log(a)
var b = new Number(a)
b.len = 1
b.add = function () {
console.log(2)
}
var d = b + 1
console.log(d)//2
var a =1;
var aa =new Number(1);
aa.name='aa'
console.log(aa)
2.4转化成为数字对象new Number (),字符串对象(),布尔对象()
var a = 'abc'
var aa = new String(a)
aa.name='aa'
console.log(aa)
var bb = aa + 'bcd'
console.log(bb)
2.5 undefined
var test= new Number(undefined)
console.log(test)//Number:NaN
var test2 =new String(undefined)
console.log(test2)//String:'undefined'
2.6 null
var test= new Number(null)
console.log(test)//Number:0
var test2= new string(undefined)
console.log(test2)//String:'null'
undefined和null是不可以设置任何属性和方法的
console.log(null.length)//报错
console.log(undefined.length)//报错
2.7 思考原始值的方法和属性
//js的包装类
//首先,他看到你是个原始值,然后看到你加了属性,认为你不对。
//但是你是客户,你是老大,我尽量满足你。让你从没有属性变有属性
//让你有属性的前提是,让你变成对象。
var a = 123
a.length = 3
//new Number(123).length=3; 我给你赋值了,但是我又保存不了你(我不可能自己声明一个变量给你保存),有没没保存,我又赋值了(我的工作)。那我就delete删掉你的属性,就不存在了。
console.log(a.length)//undefiend
var obj =3;
var obj.name='123'
//new Number(obj).name='123' //delete
console.log(obj.name)//undefined
包装类过程:
var obj={
name:'123'
}
console.log(obj)
delete obj.name
console.log(obj)
想一个办法把它保存起来
var a =new Number(123)//因为它已经是个对象了
a.len=3;
console.log(a.len)//3
思考:为啥str.length可以打印
//系统内部做了一个工作
//str -> length
//new String(str).length
//console.log(new String(str).length)
//不需要保存,千万不要说字符串有length的属性,而是中间经过了一层包装类
var str = 'abc'
console.log(str.length)//3
console.log(new Number())
console.log(new String())
3、数组
3.1数组截断
var arr = [1, 2, 3, 4, 5]
arr.length = 3
console.log(arr)//[1,2,3]
赋值超过长度时候
var arr = [1, 2, 3, 4, 5]
arr.length = 6
console.log(arr)
思考string是否能截断
var str = 'abc'
str.length = 1
console.log(str)//abc
console.log(str.length)//3
var str1 = 'abcd'
//实际访问的是new String(str1).length
console.log(str1.length) //4
笔试题目:
字符串的length只是一个只读属性
var nam = 'sz'
nam += 10//sz10
var type = typeof nam//'string'
if (type.length === 6) { //true
type.text = 'string' //new String(type).text ='string'没地方保存,delete
}
console.log(type.text)//undefined
注意:
name
虽然不是关键字也不是保留字,但它是属性,不能作为变量名,类似的有top
,location
,self
,但left
,bottom
却可以,原因是这些变量名是JS的主机变量,永远不能被重新声明
思考:怎么样输出string
var nam = 'sz'
nam += 10
var type = new String(typeof nam)//type变成对象了,就可以加属性值
if (type.length === 6) {
type.text = 'string'
}
console.log(type.text)