变量声明
1.var 类似于JavaScript中的var,它可以接收任何类型的变量,但最大的不同是Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型,如: var t; t="hi world"; // 下面代码在dart中会报错,因为变量t的类型已经确定为String, // 类型一旦确定后则不能再更改其类型。 t=1000; 上面的代码在JavaScript是没有问题的,前端开发者需要注意一下,之所以有此差异是因为Dart本身是一个强类型语言,任何变量都是有确定类型的,在Dart中,当用var声明一个变量后,Dart在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定,而JavaScript是纯粹的弱类型脚本语言,var只是变量的声明方式而已。 2.dynamic和Object Dynamic和Object 与 var功能相似,都会在赋值时自动进行类型推断,不同在于,赋值后可以改变其类型,如: dynamic t; t="hi world"; //下面代码没有问题 t=1000; Object 是dart所有对象的根基类,也就是说所有类型都是Object的子类,所以任何类型的数据都可以赋值给Object声明的对象,所以表现效果和dynamic相似。 3.final和const 如果您从未打算更改一个变量,那么使用 final 或 const,不是var,也不是一个类型。 一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略,如: //可以省略String这个类型声明 final str = "hi world"; //final str = "hi world"; const str1 = "hi world"; //const String str1 = "hi world"
console变为print
Dart语言时,请记住以下事实和概念:
-
任何保存在变量中的都是一个 对象 , 并且所有的对象都是对应一个 类 的实例。 无论是数字,函数和 null 都是对象。所有对象继承自 Object 类。
-
尽管 Dart 是强类型的,但是 Dart 可以推断类型,所以类型注释是可选的。 在上面的代码中, number 被推断为 int 类型。 如果要明确说明不需要任何类型, 需要使用特殊类型 dynamic 。
-
Dart 支持泛型,如 List<int> (整数列表)或 List<dynamic>(任何类型的对象列表)。
-
Dart 支持顶级函数(例如 main() ), 同样函数绑定在类或对象上(分别是 静态函数 和 实例函数 )。 以及支持函数内创建函数 ( 嵌套 或 局部函数 ) 。
-
类似地, Dart 支持顶级 变量 , 同样变量绑定在类或对象上(静态变量和实例变量)。 实例变量有时称为字段或属性。
-
与 Java 不同,Dart 没有关键字 “public” , “protected” 和 “private” 。 如果标识符以下划线( _)开头,则它相对于库是私有的。 有关更多信息,参考 库和可见性。
-
标识符 以字母或下划线( _)开头,后跟任意字母和数字组合。
-
Dart 语法中包含 表达式( expressions )(有运行时值)和 语句( statements )(没有运行时值)。 例如,条件表达式 condition ? expr1 : expr2 的值可能是 expr1 或 expr2 。 将其与 if-else 语句 相比较,if-else 语句没有值。 一条语句通常包含一个或多个表达式,相反表达式不能直接包含语句。
-
Dart 工具提示两种类型问题:警告_和_错误。 警告只是表明代码可能无法正常工作,但不会阻止程序的执行。 错误可能是编译时错误或者运行时错误。 编译时错误会阻止代码的执行; 运行时错误会导致代码在执行过程中引发 异常。
#关键字
Dart 语言关键字列表。
abstract 2 | dynamic 2 | implements 2 | show 1 |
as 2 | else | import 2 | static 2 |
assert | enum | in | super |
async 1 | export 2 | interface 2 | switch |
await 3 | extends | is | sync 1 |
break | external 2 | library 2 | this |
case | factory 2 | mixin 2 | throw |
catch | false | new | true |
class | final | null | try |
const | finally | on 1 | typedef 2 |
continue | for | operator 2 | var |
covariant 2 | Function 2 | part 2 | void |
default | get 2 | rethrow | while |
deferred 2 | hide 1 | return | with |
do | if | set 2 | yield 3 |
避免使用这些单词作为标识符。 但是,如有必要,标有上标的关键字可以用作标识符:
-
带有 1 上标的单词为 上下文关键字, 仅在特定位置具有含义。 他们在任何地方都是有效的标识符。
-
带有 2 上标的单词为 内置标识符, 为了简化将 JavaScript 代码移植到 Dart 的工作, 这些关键字在大多数地方都是有效的标识符, 但它们不能用作类或类型名称,也不能用作 import 前缀。
-
带有 3 上标的单词是与 Dart 1.0 发布后添加的异步支持相关的更新,作为限制类保留字。 不能在标记为 async ,async 或 sync* 的任何函数体中使用 await 或 yield 作为标识符。
关键字表中的剩余单词都是保留字。 不能将保留字用作标识符。
Dart 函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。
1.函数声明
bool isNoble(int atomicNumber) { return _nobleGases[atomicNumber] != null; }
2.如果没有显式声明返回值类型时会默认当做dynamic
3.可以使用箭头函数
4.函数作为变量 var say=(str){ print(str)}
5.函数作为参数传递 callback回调
6.可选的命名参数
异步支持 async
和await
关键词支持了异步编程,允许您写出和同步代码很像的异步代码。
Future/Future.then/Future.catchError/Future.whenComplete/Future.wait
Future.then
//Duration延迟2秒执行
Future.delayed(new Duration(seconds: 2),(){ return "hi world!"; }).then((data){ print(data); });
Future.catchError
//异步任务发生错误,在catchError中捕获错误 Future.delayed(new Duration(seconds: 2),(){ //return "hi world!"; throw AssertionError("Error"); }).then((data){ //执行成功会走到这里 print("success"); }).catchError((e){ //执行失败会走到这里 print(e); });
Future.whenComplete 无论成功或失败都会走到这里
Future.delayed(new Duration(seconds: 2),(){ //return "hi world!"; throw AssertionError("Error"); }).then((data){ //执行成功会走到这里 print(data); }).catchError((e){ //执行失败会走到这里 print(e); }).whenComplete((){ //无论成功或失败都会走到这里 });
Future.wait 等待多个异步任务执行结束后才进行的操作,wait[ajax1,ajax2,ajax3]
Async/await JavaScript中的async/await
功能和用法是一模一样的
task() async { try{ String id = await login("alice","******"); String userInfo = await getUserInfo(id); await saveUserInfo(userInfo); //执行接下来的操作 } catch(e){ //错误处理 print(e); } }
@Override标签的作用:
@Override是伪代码,表示方法重写。
@Override标签的好处:
1.作为注释,帮助自己检查是否正确的复写了父类中已有的方法
2.便于别人理解代码
3.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.
例如:在重写父类的service时,在方法前面加上@Override 系统可以帮你检查方法的正确性。
1
2
3
4
5
6
7
|
public class AdminServlet extends HttpServlet{ @Override //表示方法重写 protected void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ req.setCharacterEncoding( "utf-8" ); } } |
如果将方法错误写为Service