programingBeginner
@programingBeginner

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JS [setProperty]と[styleを直接変更する]の違い

解決したいこと

こんにちは!
jsである要素のstyleを変更しようとしています。最初はstyleを直接変更しようとしていたのですが、エラーが起きてしまいました。そこで、setPropertyを使うことにしたらエラーが起きず正常に機能しました。
この理由がわからないので、教えていただきたいです。
よろしくお願いいたします。

発生している問題・エラー

';' expected.

該当するソースコード

<template>
  <div ref="slideRef" class="slide"></div>
</template>

<script lang="ts">
  const slideRef = ref<HTMLDivElement>();
  slideRef.value && slideRef.value.style.transform = `rotateX(1deg)`  // = に上記のエラーが出る。
  return {
        slideRef
      };
</script>
<template>
  <div ref="slideRef" class="slide"></div>
</template>

<script lang="ts">
  const slideRef = ref<HTMLDivElement>();
  slideRef.value && slideRef.value.style.setProperty("transform","rotateX(1deg)")  //正常
  return {
        slideRef
      };
</script>

自分で試したこと

前者のコードでエラーが起こる理由は、&&を使ったりしているからなのかなと思いましたが、全然わかりません。
よろしくお願いします。

&&を入れた理由

最初は、

slideRef.value.style.transform = "rotateX(1deg)"

このように書いていました。しかし、Object is possibly 'undefined'.というエラーが出ました。
原因としては、slideRefがundefindの可能性があることからのエラーだと解釈しました。
よって次に、

slideRef.value?.style.transform = "rotateX(1deg)"

と書きました。
すると、上のエラーは消えたのですが、また新たにThe left-hand side of an assignment expression may not be an optional property access.と出てきました。
この意味は、左辺で短縮形は使えないよという意味だと解釈したので、上記のコードと同じ意味になる

slideRef.value && slideRef.value.style.transform = `rotateX(1deg)` 

という風に書き直しました。
するとそのエラーが消えて、新たに';' expected.というエラーが=のところに出たので、今回qiitaに質問したという流れになりました。

0

2Answer

JS演算子の優先順位によると、=演算子の優先順位は、&&演算子の優先順位よりも低いです。

そのため、次の式は、

a && b = 1

以下のように解釈されます。

(a && b) = 1

代入演算子の左オペランドが、変数やプロパティなどの代入可能な形式になっていないことによる構文エラーです。

ちなみに、以下の式は有効です。

a && (b = 1)

代入式そのものは、右オペランドそのもの(今回では1)として評価されます。

3Like

Comments

  1. ご回答ありがとうございます!
    jsの演算子にも数学の計算順位と同じようものがあるのですね。
    代入演算子の左オペランドが代入可能な形式になっていないという、エラーの理由を明確に理解することができました。
    ありがとうございました。

&&を使ったりしているからなのかなと思いましたが、全然わかりません。

その通りです。
題名の [setProperty]と[styleを直接変更する]の違いではありません。
slideRef.value && を入れた理由が分かりませんが、
slideRef.valueがtrueの時に後半の処理を行うことにして、下記のコードと同義に解釈します。

  if (slideRef.value) {
    slideRef.value.style.transform = `rotateX(1deg)`;
    // もしくは
    slideRef.value.style.setProperty("transform","rotateX(1deg)");
  }

この書き方ではエラーが出ません。
もしやりたいことと違った場合は申し訳ございません。

後者のコードは&&の前後とも、真偽値を判断できます。
CSSStyleDeclaration.setProperty()の戻り値undefinedだそうです。

前者のコードで&&の後ろは代入文になっていて、真偽値を判断できるものではありません。
なんというか、普通に書き方として正しくないため、
構文エラーが出たかと思います。

1Like

Comments

  1. @eudika さんご指摘ご補足ありがとうございます!
    勉強になりました!
  2. ご回答ありがとうございます!
    ずっとお題の違いがエラーの原因だと考えていました。
    &&を入れた理由を本文のところに追加させていただきました。
    情報足らずで申し訳ありません。
    また、if文の書き方も教えてくださり、&&がコードに入る意味というのも明確に理解することができました。
    ありがとうございました。

Your answer might help someone💌