今晚月色真美

前言

关于iOS及Web的使用语言Object-C、Swift、JavaScript,大家都耳熟能详,那它们到底是什么类型的静态语言?以及什么强弱类型语言?很多同学只是简单的背出它们是什么语言及类型,但并没有理解到,现在来举例说明和分享一下。

分析

Object-C

我用的最多的当然是Object-C,毕竟是做iOS开发出身,对这个语言了解最深。首先,因为黑魔法RunTime机制,Object-C是一个运行时的动态类型的强类型语言,举例如下:

  1. 以下两种情况都可以看出,Xcode编译时并不会报错,说明是一个动态语言,运行时才会去检验类型
1
2
3
4
NSString *test = @"1231231";
test = [[NSDate alloc] init];

NSDate *test2 = @"1231231"; // test2的真实类型是什么,运行时会得到String类型,并不是声明时的NSDate类型
  1. Object-C是强类型语言,因为变量必须声明类型才能使用,说实话,Object-C的代码简洁性,是真的不怎么高
1
2
3
NSString *certsPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"crt"];
NSError *error;
NSString *contentInUTF8 = [NSString stringWithContentsOfFile:certsPath encoding:NSUTF8StringEncoding error:&error];

Swift

iOS的这两种开发语言,Swift和OC,Swift更简洁了,减少了代码的冗余性,最开始接触它的时候,我还以为它是一门弱语言类型的语言,后来发现我错了,下面会娓娓道来,它实际是一门静态类型的强类型语言

  1. 以下情况代码编译会报错:’Cannot assign value of type ‘NSDate’ to type ‘String’’ ,类型错误,由此看出Swift是静态类型语言
1
2
3
var tmp = "asdfas"
let date = NSDate.init()
tmp = date
  1. 为什么一开始会觉得它是弱类型语言呢?

Swift 变量不强制的指定类型,而是用 var 和 let 表示可变与不可变。所以,误Swift是一门弱类型的语言。

像下面的代码块,变量赋值时并没声明类型

1
2
let num = 1
let str = "2"

基于以上,从自身理解,误以为Swift是弱类型语言

但是,实际上,这里没有强制声明类型,看似一个弱类型的语言,其实不然。Swift 编译器能够推断出 num 是 Int 类型。那么 num 就不能再被赋值为 String 类型。更不能写成如下的形式:

1
2
3
let num = 1
let str = "2"
let result = num + str

编译器将会报如下的错误:

1
2
3
4
5
error: binary operator '+' cannot be applied to operands of type 'Int' and 'String'
let result = num + str
~~~ ^ ~~~
note: overloads for '+' exist with these partially matching parameter lists: (Int, Int), (String, String), (Int, UnsafeMutablePointer<Pointee>), (Int, UnsafePointer<Pointee>)
let result = num + str

这说明了,Swift 是一门强类型语言。Swift 的类型声明,你可以看成是在定义变量的时候,隐式声明的(由编译器推断出),当然也可以显式的声明。如下:

1
let num: Int = 1

JavaScript

Web中的常用语言JavaScript,如果有语言基础的话,是一门很快上手的语言,我也很喜欢JavaScript,当然也有使用中比较头疼的事,因为它是一门动态类型的弱类型语言,往往项目中在项目运行成功后,控制台意想不到的报错,不像强语言类型那样,直接编译不过,而我又有Swift的编写思想,想着它类型编译通过了,运行肯定就没问题,往往会出现比如编译没问题,类型错误的问题,而且它没有iOS中nil可以调用任何方法的容错机制,如果这个对象为nil再调用其某个方法也会报错,所以写的时候必须要判断是否为空,增加代码冗余性,但是,好处大于弊端,比如代码简洁性,可以动态写很多业务逻辑,我还是很喜欢它。

  1. 动态类型语言,以下情况,编译没问题,动态运行时赋值类型
1
2
3
let tmpFlag = false
let test = 'asdfasdfas'
test = tmpFlag // 所以最终test为Bool类型了
  1. 弱类型语言,书写变量时不用声明类型也可
1
2
3
let tmpFlag = false
let test = 'asdfasdfas'
let jjjj = Date.now()

扩展

TypeScript

TypeScript是JavaScript的一个超集,TypeScript可以使用JavaScript中的所有代码和编码概念,TypeScript是为了使 JavaScript的开发变得更加容易而创建的,它是关于尽早捕获错误并使您成为更高效的开发人员,它是什么类型的语言?我们把在JavaScript上实验的代码,放在ts里一试便知道。

  1. 以下情况是js上实验的代码,在ts里编译报错,说明TypeScript是静态类型语言
1
2
3
let tmpFlag = false
let test = 'asdfasdfas'
test = tmpFlag

报错如下:

1
43:9 Type 'false' is not assignable to type 'string'.
  1. 相同代码又在ts里实验,编译未报错,故TypeScript是弱类型语言
1
2
3
let tmpFlag = false
let test = 'asdfasdfas'
let jjjj = Date.now()

以下代码也未报错:

1
2
3
let num = 1
let str = '2'
let result = num + str

综上可知,TypeScript是一门静态类型的弱类型语言

 评论

本站总字数统计:49.8k

感谢您的浏览, 本站总访问量为 次 。
载入天数...载入时分秒...