JavaScript 强类型语言和弱类型语言的区别
强类型语言和弱类型语言的区别
-
强类型是数据定义时候就确定数据类型的,以后是不可以修改的,而且变量在计算机中分配的储存空间是固定的;比如a为数字1;后面就不可以修改成abc这种字符串类型;
- 一个萝卜一个坑,位置都为每个数据安排放好了
- 比如c++里的
string name; int age;
name就是一个字符串类型,而age是数值类型的;
-
弱类型的语言,比如js是可以任意修改的
- 是先占一个位置,但是不分配数据类型的大小,赋值数据的时候再用,不事先准备;
- 类似只准备凳子,不安排座位大小,胖的就挤一挤,瘦子就多占点;
- 占位置和做位置分开的;
- 变量的声明和变量的赋值是分开的;
- 注意:JS中的变量只是准备的不充分,但是也有准备的;就牵扯到预解释,在预解释那章会详细介绍;
-
强类型语言,在变量创建的时候,就强制要求声明类型;而弱类型语言就显得很随意;
-
强类型的语言中,变量类型是事先指定的;
-
弱类型的语言中,变量的类型是赋值后根据值来决定的;赋什么样的值,就决定了变量是什么类型;
- 如果只声明变量,不复制,你是不知道是什么类型的
JS是一门弱类型的语法,在编译器的阶段不能检测出类型错误;
所在在做变量储存的时候,变量名需要有意义,而且一个变量只用于储存一个类型的值;
JavaScript 和 Java
Java是一种强类型,JavaScript是一种弱类型的;
JavaScript 和 Java 有一些共性但是在另一些方面有着根本性区别。
JavaScript语言类似 Java 但是并没有 Java 的静态类型和强类型检查特性。
JavaScript 遵循了 Java 的表达式语法,命名规范以及基础流程控制,这也是 JavaScript 从 LiveScript 更名的原因。
与 Java 通过声明的方式构建类的编译时系统不同,JavaScript 采用基于少量的数据类型如数字、布尔、字符串值的运行时系统。
JavaScript 拥有基于原型的对象模型提供的动态继承;也就是说,独立对象的继承是可以改变的。
JavaScript 支持匿名函数。 函数也可以作为对象的属性被当做宽松的类型方式执行。
与 Java 相比,Javascript 是一门形式自由的语言。
你不必声明所有的变量,类和方法。你不必关心方法是否是 共有、私有或者受保护的,也不需要实现接口。
无需显式指定变量、参数、方法返回值的数据类型。
Java 是基于类的编程语言,设计的初衷就是为了确保快速执行和类型安全。
类型安全,举个例子,你不能将一个 Java 整数变量转化为一个对象引用,或者由Java字节码访问专有存储器。
Java基于类的模型,意味着程序包含专有的类及其方法。
Java的类继承和强类型要求紧耦合的对象层级结构。这些要求使得Java编程比JavaScript要复杂的多。
相比之下,JavaScript 传承了 HyperTalk 和 dBASE 语句精简、动态类型等精髓,这些脚本语言为更多开发者提供了一种语法简单、内置功能强大以及用最小需求创建对象的编程工具。
JavaScript 和 Java 的对比
JavaScript | Java |
---|---|
面向对象。不区分对象类型。通过原型机制继承,任何对象的属性和方法均可以被动态添加。 | 基于类系统。分为类和实例,通过类层级的定义实现继承。不能动态增加对象或类的属性或方法。 |
变量类型不需要提前声明(动态类型)。 | 变量类型必须提前声明(静态类型)。 |
不能直接自动写入硬盘。 | 可以直接自动写入硬盘。 |
更多参考:对象模型的细节
基于类 vs 基于原型的语言
JavaScript 是一种基于原型而不是基于类的面向对象语言。
正是由于这一根本的区别,其如何创建对象的层级结构以及对象的属性与属性值是如何继承的并不是那么清晰。
基于类的面向对象语言,比如 Java 和 C++,是构建在两个不同实体的概念之上的:即类和实例。
- 类可以定义属性
- 这些属性可使特定的对象集合特征化(可以将 Java 中的方法和变量以及 C++ 中的成员都视作属性)。类是抽象的,而不是其所描述的对象集合中的任何特定的个体。例如 雇员 类可以用来表示所有雇员的集合。
- 一个实例是一个类的实例化;也就是其中一名成员。
- 例如, Victoria 可以是 雇员 类的一个实例,表示一个特定的雇员个体。实例具有和其父类完全一致的属性。
基于原型的语言(如 JavaScript)并不存在这种区别:它只有对象。
基于原型的语言具有所谓原型对象的概念。原型对象可以作为一个模板,新对象可以从中获得原始的属性
。任何对象都可以指定其自身的属性,既可以是创建时也可以在运行时创建。而且,任何对象都可以作为另一个对象的原型,从而允许后者共享前者的属性。
查看 MDN对象模型的详情 来了解更多JavaScript和Java的不同。