Objective C VS JavaScript
- Time: 12 April 2014
- Categories:
- iOS 30
- Tags:
- Objective-c 30
- javascript 8
之前的编程语言主要是JavaScript,刚学OC时有蛮多不习惯的,所以从一个JSer的角度记录JavaScript和Objective C (下面简称JS和OC) 的特点比较。
##JS和OC的差异
###type
弱类型,JavaScript中不需要申明变量类型即可直接使用; 变量走到那,类型跟到哪,开始学这个的可能会不习惯,比如:
//JS
var device = 'iPhone';
var deviceType = ['4s', '5s'];
//OC
(NSString* )device = @"iPhone";
(NSArray* )deviceType = [NSArray arrayWithObjects:@"4s",@"5s", nil];
另外,从上面的例子中也能发现,OC中不能像JS那样方便的定义字面量变量 (后来在其他资料中发现也是可以用字面量来定于对象的,不过写法还是没有JS简洁,哈哈) 。不同类型的变量初始化时都要加上一堆冗余的申明。
###方法调用以及参数传输
还是感觉JS中的方法调用更加简洁,一目了然。另外OC中的调用方法通常称之为send message.
//JS
Object.method(arg)
//OC
[Object method:arg]
###一次执行多个方法
OC支持multiple method,多个method之间用空格分隔即可(第一次看到这种形式真是莫名其女),和jQuery的链式调用有点类似
//JS
jQuery('#foo').css('color': 'red').show();
//OC
- (BOOL) writeFile:(NSString*)path atomically:(BOOL)useXFile;
###Debug
调试代码也是我非常care的一个点。两种语言的调试方法都很方便,OC的写法略繁琐,如:
//JS
console.debug(foo);
//OC
NSLog ( @"The current date and time is: %@", [NSDate date] );
##JS和OC的共性
###nested call
JS和OC都支持嵌套调用,在JS中,我们可以将一个函数的结果作为参数传递给另外一个参数(这个特性很方便)。在OC中,我们也可以这么干,如:
//js code
obj.method(obj2.method2())
//OC code
[obj method:[obj2 mehtod2]]
###Dot syntax
从OC 2.0开始,我们可用使用‘. ’语法来替代setter和getter操作。如:
//JS
obj.name = 'iPhone';
console.log(obj.name);
//OC setter and getter
[obj setName:@"iPhone"];
output = [obj name];
//OC dot syntax is better
obj.name = @"iPhone";
output = obj.name ;
###Extend
OC中的categories允许你动态去扩展一个类的方法(不需要成为他的子类就可用用新方法). 这个特性让我想起JS中的prototype。 比如我们经常对低版本浏览器扩展String的trim方法。
//JS
String.prototype.trim = function () {
return this.replace(/^\s+|\s+$/g, '');
}
var myStr = ' iPhone';
myStr.trim();
下面的代码展示了给NSString对象扩展一个isURL方法
//OC code:
//.h
#import <Cocoa/Cocoa.h>
@interface NSString (Utilities)
- (BOOL) isURL;
@end
//.m
#import "NSString-Utilities.h"
@implementation NSString (Utilities)
- (BOOL) isURL {
if ( [self hasPrefix:@"http://"] )
return YES;
else
return NO;
}
@end
//use
NSString* string1 = @"http://ikitty.github.io/";
if ( [string1 isURL] )
NSLog (@"string1 is a URL");