简介

JavaScript是一种动态语言,也是一种弱类型语言。一些简单的概念:

  • 动态语言:运行时逐行解析
  • 静态语言:先编译后执行

js与C语言这些语言相比差距很大,js在很多表达上十分灵活,但也带来了很多弊端,容易产生细微的bug,且运行不报错,难以排查,所以编写js一定要有良好的编码习惯。

下面我将从C与js的一些差别来浅谈js的一些特性。

变量

声明变量

C在声明变量时要给变量类型,而且不同变量类型之间不能混用(可以隐式转化,显式转化,但是不推荐)

js在声明变量时,只要补个var,在ES6中用的let,js不同类型之间可以瞎转化而不报错,变量名更像一个代号,可以随时指向不同的东西。常用的转化通常是其他类型转化为字符串类型,如字符串拼接。

var a = "123"
a = 13
a = 21 +"111"

如上,不会报错

变量类型

主要这么几种:

  • 字符串(可以各种拼接)
  • 数字(没有正整数,浮点数区分,计算时要注意,这点和C差距很大)
  • 布尔值(空字符串为false,)
  • 数组(数组和python有点像,啥类型都能往里面装,很方便)
  • 对象(对象和python的字典有点像,也像json格式,但是不一样的是键名不是字符串,但是很多情况下可以相互转化),js的对象很不规范,建议学习ES6、ES7、typescript

函数

函数声明方式

function a(){}		//声明式写法
var b1 = function b2(){}	//表达式写法
var c1 = function (){}

声明很简单,调用方法和其他语言一致。特别注意,表达式写法千万不能和执行函数搞混了,下面的写法是错的!

function a(){}
var b = a()//这不是表达式写法!!这个b的值是a的返回值!!

参数传递

js的参数传递都会重新创建变量,和C语言的值传递类似,但是对象的传递要注意,这是由js的内存空间分配决定的。(对象会存在堆空间里)。因此,对象传递的效果和C语言的引用传递相当。

javascript和c结合编程 javascript与c语言区别_javascript和c结合编程

不严格的参数要求

js由于没有类型限制,所以传递参数的类型是随意的,很任意出bug,而且其函数参数数量都是没有限制的。参数会被储存在arguments数组里,下面是个例子:

function a(s){
	console.log(s);
	console.log(arguments);
}
a(1,2,3,4,5,6,7,8,9);

立即执行函数写法

(function a(s){
    console.log(s);
})(1)

闭包

闭包就是一个函数用到了作用域外的变量,这主要涉及到了作用域。为了创建函数作用域,我们常常使用闭包。

闭包有自己的内存空间,存在内存泄漏风险。闭包相当于一个函数给予了外界访问内部变量的桥梁。

作用域

承接上节,js没有块级作用域!比如:

{var a = 1}
{a = 2}
console.log(a)
\\------------------------
for(var b=1;b<5;b++){}
console.log(b)

输出正常,也就是花括号根本没啥作用,同理,for循环也没有作用域,极其容易导致bug。

for(var b=1;b<5;b++){}
console.log(b)

输出正常,也就是花括号根本没啥作用,同理,for循环也没有作用域,极其容易导致bug。

js的函数作用域异常奇特,与C这类语言想差甚远,使用的要特别注意,能用let就不要用var。