JavaScript:是直译型的脚本语言。是一个动态类型,弱类型,基于原型的语言。需要通过解释器对语句进行翻译,而这个翻译官就是JS引擎。
脚本语言:需要一个宿主。依赖于引擎,在浏览器当中执行。
动态类型:类型是可以变化的。
var a = 1; a = "abc";// 由Number类型转为了字符串 a = {}; a = true;
弱类型:程序员在开发的时候可以忽略类型。
定义变量时,可以忽略类型。
var a = true; var b = {}; var c = ""; var d = true;
函数传参时,函数返回结果时,可以忽略类型。
function run(a,b){ if(typeof a === "number" && typeof b === "number"){ }else{ } return 23; } run(1,2); run("a","b"); run({},function(){})
定义对象,设置属性时。可以忽略类型。
var obj = { a:true, b:"123", c:function(){ } } obj.c = 567; var arr = [1,2,3];
基于原型
类,对象。 对象是通过类实例化出来的。 实例化:new
js是没有类的概念,没有继承。
JS是有对象的,JS当中可以将构造函数视为类。
JS当中的继承,其实是对象继承对象。原型
计算机语言:
程序员与计算机资源的是源码。
计算机语言分为两部分:
- 低级语言
- 汇编语言:是指令。指令与机器语言的指令是1:1的关系。最终是由汇编器对其进行翻译,翻译为机器语言。
- 机器语言:指令。这些指令为二进制。机器语言才是最底层的语言。
- 高级语言
* 编译型语言:c,c++。不能够直接运行,在运行之前需要一次性提前编译。生成一个相对应的执行文件。在服务器当中运行的是该文件。
* 解释型语言:又称为直译型语言。javascript,shell,python。是程序在执行时进行解释(翻译),JS引擎会一行一行的对其进行翻译。
* 混合型语言:拥有编译与解释共同的特点。 JAVA ,C#
一、JS
基础深入复习与总结
1、数据类型
1.1、数据类型分类
- 基本(值)类型
字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol ,
BigInt
在基本类型中,有三个比较特殊的存在:String Number Boolean,由于这三个基本类型都有自己对应的包装对象,也被称之为基本包装类型。
- 怎么生成一个基本包装类型的包装对象呢?
var str = "abcdefg"; // 包装对象,首先它是一个对象。包装的是你的基本数据类型。 var str1 = new String("abcdefg"); // Object会根据传入的参数,生成相对应类型的包装对象。 var str2 = new Object("abcdefg"); console.log(str1,str2); var num1 = new Number(1234); var num2 = new Object(1234); console.log(num1,num2); var bol1 = new Boolean(true); var bol2 = new Object(true); console.log(bol1,bol2);
- 基本包装类型不是对象,为什么会有属性呢?
基本包装类型当中的属性与方法,全部都是来自于相对应包装对象的原型。会隐式执行下面案例当中的{}程序
// 对象:拥有属性或方法的值,可以称其为对象。 var userName = "刘德华"; console.log(userName.charAt(0));// 刘 // 隐式执行: { // 创建一个String类型的包装对象,值为刘德华 var _userName = new String("刘德华"); // 输出 console.log(_userName.charAt(0)); // 将_userName在内存中清除。 _userName = null; }
引用类型和基本包装对象的区别?
// 答:生命周期不同。引用类型在定义之后,在自己的作用域执行完毕之前会一直保存在内存当中。而包装对象往往是一瞬间。 // 定义一个对象类型。 var obj = { age:12 }; console.log(obj.age);// 12 // 定义了一个字符串类型的变量 var str = "年龄"; // 增加属性number值为20 str.number = 20; // 会隐式执行: { // 生成一个包装对象 var _str = new String("年龄"); // 赋值 _str.number = 20; // 清空 _str = null; // console.log(_str); } console.log(str.number);// undefined // 会隐式执行 { var _str2 = new String("年龄"); console.log(_str2.number); _str2 = null; }
如何给基本类型添加方法或者属性呢?
答:将属性或方法放置到相对应的包装函数的原型对象当中。
// 练习:增加一个名字为last的方法,该方法返回字符串的最后一个字符 String.prototype.last = function () { console.log("last 执行了",this); return this.charAt(this.length-1); } var str = "我爱你中国,我亲爱的母亲,我为你流泪,也为你自豪!" // console.log(str[0]); // console.log(str.charAt(0)); console.log(str.last());// 输出str的最后一个字符 // { // var _str = new String("我爱你中国,我亲爱的母亲,我为你流泪,也为你自豪!"); // _str.last(); // }
“ == ” 运算符将原始值和其包装对象视为相等,“ === ”全等运算符则视为不等。
var str = "abc"; var str1 = new String("abc"); console.log(str == str1,str === str1);// true false
最后,我们可以通过String(),Number(),Boolean()构造函数来显式创建包装对象。但是通常情况下不建议这么做。
- 对象(引用)类型
对象(Object)、数组(Array)、函数(Function)
// 后面详细介绍
1.2、数据类型检测
typeof
JavaScript
是一门弱语言,它在声明变量时无需确定变量的类型,JavaScript
在运行时会自动判断。那么如何判断一个变量的类型呢,JavaScript
提供了typeof
运算符,用来检测一个变量的类型。
typeof
运算符的返回类型为字符串 : undefined、boolean、 string 、 number 、 object 、 function
- 可以区别: 数值, 字符串, 布尔值, undefined, function
var a; console.log(typeof a);// undefined function fn(num) { console.log(typeof num);// undefined } console.log(typeof fn);// function console.log(typeof fn());// undefined var obj = {}; console.log(obj.userName);// undefined // 如果写的是表达式加上括号,如果不写括号,那输出的是表达式的结果 var bol = true; console.log(typeof bol);// boolean console.log(typeof(bol));// boolean console.log(typeof 1===1);// false console.log(typeof(1===1));// boolean var str = "123"; console.log(typeof str);// string console.log(typeof str/1);// NaN console.log(typeof(str/1));// number var und = undefined; console.log(typeof und);// undefined
- 不能区别: null与对象, 一般对象与数组
var obj= {}; var arr = []; console.log(typeof obj,typeof arr);// object object var n = null; console.log(typeof n);// object
-
instanceof
略console.log([1,2,3,4] instanceof Array);// true console.log(1 instanceof Array);// false
-
constructor 略
1.2(附加) in与hasOwnProperty
的区别:
var obj = {
userName:"zhangsan"
}
obj.__proto__.run = function(){
}
// in 用于判断对象是否拥有指定属性。(属性在实例中或在原型链当中只要存在即为true)
// hasOwnProperty 只判断实例
console.log("userName" in obj);// true
console.log(obj.hasOwnProperty("userName"));// true
console.log("run" in obj);// true
console.log(obj.hasOwnProperty("run"));// false
1.3、Undefined 和 Null
- Undefined
Undefined类型只有一个值,即undefined。
// Undefined类型只有一个值,即undefined。 console.log(undefined in window);// true
常见的生成Undefined的环境:
变量被声明了,但没有赋值时,就等于undefined
var a; console.log(a);// undefined
调用函数时,应该提供的参数没有提供,该参数等于undefined
function fn(a,b){ console.log(a,b);// 1 undefined } fn(1);
对象没有赋值的属性,该属性的值为undefined
var obj = { userName:"zhangsan"; } console.log(obj.userName,obj.age);// zhangsan undefined
函数没有返回值时或return右侧没有内容时,默认返回undefined
// return右侧没有内容时 function fn() { return; } console.log(fn());// undefined // 没有返回值时 function fn2() } console.log(fn2());// undefined
Undefined常被用于条件判断
// 复习条件判断。undefined如果直接作为判断条件,为false if(1===1){ console.log("成立"); } if(true){ console.log("成立2"); } if(undefined){ console.log("不成立1"); } if(!undefined){ console.log("成立3"); } if(0){// false console.log("不成立2"); } if(""){// false console.log("不成立3"); } // 1、判断函数接收的参数。 0 "" false不考虑 function fn(a) { if(a){ console.log("有值"); }else{ console.log("无值"); } } // 2、判断函数接收的参数。考虑0 "" false function fn2(a){ if(a !== undefined){ console.log("有值") }else console.log("无值") } // fn2(""); // 3、判断对象是否拥有指定的属性 var obj = { userName:"zhangsan" } // 如果考虑0 false "" ,条件更改为if(obj.userName !== undefined) if(obj.userName){ // 有值 console.log("有值") }else console.log("无值")
-
Null
# 道理经:无,万物之始也,有,万物之母也。
null 类型是第二个只有一个值的数据类型,这个特殊的值是 null
从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用
typeof
操作符检测null时会返回"object"的原因。console.log(typeof null);// object
常见Null的环境:
作为函数的参数,当你不想传,或者是不需要传参数时,可以使用null.
// obj 接收的一个形参。要求接收的类型是一个对象 function fn(obj,a){ if(obj === null) return; if(typeof obj === "object"){ console.log("123"); } } fn(null,1);
作为对象原型链的终点
function Box(){ } var box = new Box(); // box 是通过构造函数Box实例化(new)出来 // box.__proto__ === Box.prototype console.log(box.__proto__ === Box.prototype);// true console.log(Box.prototype.__proto__ === Object.prototype);// true console.log(Object.prototype.__proto__);// null
Null的使用场景:
初始赋值, 表明要赋值的对象为null
// 未来该值有可能是对象的话,初始值可以设置为null. var obj = null;// 将初始值设置为null,说明后面有可能要将其设置为一个对象 // .... 逻辑 obj = { a:1, b:2 }; var str = ""; // 说明后续值应该是一个字符串 var where = null; var keyword = "" if(接收的关键字是否符合要求){ where= { keyword:keywored } }
内存回收:将值设置为 null,可以对其进行回收。
var a = 1; var b = {}; a = null; b = null;
- null和undefined的区别:
- undefined 代表变量没有赋值
- null 代表变量赋值,只是值为null