JavaScript简史,浏览器(js引擎)相关知识及部分基础(一)

了解Javascript简史

发源于1996年由brendan Eich,首次诞生于浏览器,原名为LiveScript,后因与sun公司合作,需市场宣传,改名为JavaScript,后期版权归Oracle所有。

了解浏览器

浏览器主要分为shell部分内核部分

shell

主要负责浏览器外观设置及操控,一些表层东西的实现。

内核

内核又分为渲染引擎 js引擎,主要是html,css,js的渲染和实现,是浏览器所具备的最重要的一部分,只有拥有独立内核的浏览器才称之为主流浏览器,中国几乎所有的浏览器都不具备自己独立的内核,所以不被称之为主流浏览器。

  • 2001年ie6的诞生,首次做到了js引擎的优化和分离(里程碑,可以运行上万行的js代码)
  • 2008年Google发布最新浏览器chrome,采用优化后的js引擎,代号V8,能将js代码直接翻译为机器码进行编译,更好的提升了他的运行速度而闻名于世。
  • 后Firefox也推出了强大的js引擎:
    Firefox3.5——》TraceMonkey引擎(对频繁使用的代码做路径优化)
    Firefox4.0——》JeagerMonkey引擎
主流浏览器
  • IE——>trident
  • Chrome——>webkit/blink
  • Firefox——>Gecko
  • Opera——>presto
  • Safari——>webkit

JavaScript

  • 解释性脚本语言
    读一行解释一行,跨平台使用,但速度略低。

  • 单线程
    即同步执行代码。

  • 执行ECMA标准

== 与 ===

JavaScript作为一种解释性语言,对于变量的定义,并不严格要求,可根据实际情况自行判断,所以在很多时候,它会帮助我们自动的进行隐式转换。
例如我们想要判断 if(1 == “1”),本来是两种类型的数据,按照常理是不能比较,就算比较也应是false,但是在js当中,他却判断为true,这是因为js在使用 == 或!=时,会自动的帮助我们进行隐式转换(Number()转换可以转换一切类型,将不能够转为数字的变量,转为NAN),有时则会差强人意,得到的结果并非我们想要的。这时候,我们就需要使用 === 和 !==.

undefined == null —— nan != nan

undefined和null不等于任何东西,但他们之间是相等的。
NaN是更特殊的一种类型,他和自己也不相等。

typeof()

用tyoeof函数可以检测变量的属性,它是js当中唯一一个永远不会报错的函数,如果检测到未定义的变量,会以字符串的形式返回“undefined”

var a = 1;
function fuc() {
    
    
	if(function fn(){
    
    }){
    
    
		a += typeof(fn);
	}
	console.log(a)
}

这道题考察的知识点很多,首先用if将函数声明包裹起来,一旦出现在括号当中,就会被当做是表达式,其次函数转为表达式之后将丢失其函数名,所以fn会变成未定义,然后根据我们对typeof()的知识,他将未定义的变量返回undefined的字符串,和a想加就会字符串拼接转为字符串“1undefined

函数

函数作为JavaScript最为重要且突出的一部分,它可分为函数和匿名函数,

function write(){
    
    document.write(“hello world!”)}   //函数
var a = function () {
    
    document.write(“hello world!”)}  //函数表达式

js的函数不同于其他语言的函数,他规定了函数的形参和实参可以不等长,当形参的数量多余实参时,多余的参数相当于使用undefined来定义,
当实参的数量多余形参时,多余的参数会被保存于 argument列表当中,

argument.length表示了实参的长度,函数名.length则表示了形参的长度
argument中的元素和形参不是一个实体,但却包含映射关系,当形参做出改变,argument的对应元素也会发生改变,当形参多出来的值发生变化时,列表无对应元素,则不发生改变。

立即执行函数

在程序运行当中,有一些函数是只会用到一次,然后一直存在于内存等待被再次调用,显然这是一种浪费内存的形式,在JavaScript当中,为我们提供了一种立即执行函数,让函数在运行期间立即执行,然后被销毁,其格式为:

(function (形参){
    
     /*函数代码*/ }(实参)) //W3C建议
(function (形参){
    
     /*函数代码*/ })(实参)

这里的“()”被当作为执行符号,且只有表达式才能被它执行

function test() {
    
    
	//代码块
}()

显然以上这种方法去定义立即执行函数是会被语法错误,因为在执行符之前,这里是一个函数声明,并非一个表达式,所以它是有错误的。
然而利用函数表达式,他就能被顺利执行。如下代码展示。

var a = function test() {
    
    
	//代码块
}()

上述代码,我们可以将它看作是三个步骤来执行,首先是创建函数表达式,然后再声明变量a,最后将表达式赋值于变量a。在函数执行完毕之后,相当于我们只进行了声明变量,所以可以console.log(a)来检测,发现a为undefined。
立即执行函数在完成之后,将会销毁,即忘记与之对应的函数名,所以我们可以索性将它定义为匿名函数

练习题

function test(a,b,c) {
    
    
	return a+b+c;
}(1,2,3)

这是一道很坑的练习题,因为我们知道,在函数声明后面跟上执行符号,是会报出语法错误,而无法运行的,但这道题却没有报出相关错误,在预编译时期,它并没有将“(1,2,3)”当做带有参数的执行符号,而是将“(1,2,3)”和函数声明分开来看,单独的函数声明并没有错误,单独的“(1,2,3)”也是没有错误的,所以编译器并不把他当做错误,也不把它当做立即执行函数去执行。

猜你喜欢

转载自blog.csdn.net/baldicoot_/article/details/106140100